Toon posts:

Lastige MySQL query

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een probleempje met een query. Helaas kan ik geen sub-selects gebruiken want dan zou ik de oplossing al hebben:
code:
1
2
3
4
"SELECT DISTINCT gemeentenaam FROM gemeentecijfers WHERE gemeentenaam NOT IN 
(SELECT DISTICT gemeentenaam FROM gemeentecijfers, product 
WHERE product.datum BETWEEN '$begindatum' AND '$einddatum')
ORDER BY gemeentenaam ASC"

Ik dacht: dan doe ik het gewoon zo:
code:
1
2
3
"SELECT DISTINCT gemeentecijfers.gemeentenaam FROM gemeentecijfers, product 
WHERE gemeentecijfers.gemeentenaam = product.gemeentenaam AND product.datum 
NOT BETWEEN '$begindatum' AND '$einddatum' ORDER BY gemeentecijfers.gemeentenaam ASC"

Maar... in de tabel product kan een gemeente vaker voorkomen. Dus in de laatste query kan ie een record vinden die wel BETWEEN die datum valt en ook een die er niet tussen valt en ze hebben allebei dezelfde gemeentenaam. Dus ik krijg gemeenten erbij die ik niet wil. Ik wil alleen records waar niks is te vinden tussen die data.

Is dit onmogelijk zonder sub-queries?

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Zo iets?
code:
1
2
3
4
5
"SELECT DISTINCT gemeentecijfers.gemeentenaam FROM
gemeentecijfers, product WHERE gemeentecijfers.gemeentenaam 
= product.gemeentenaam AND glas.datum < '$begindatum' AND 
glas.datum > '$einddatum' ORDER BY 
gemeentecijfers.gemeentenaam ASC"

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Verwijderd

Topicstarter
Nee! Want wat krijg je nu als er nooit buiten of binnen die periode iets geregistreerd is in die gemeente? Die gemeenten wil ik ook!

Goeie poging overigens :)

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Je moet de select met product met een outer join doen en dat testen op product.<willekeurig veld> IS NULL
Wel even voor zorgen dat het willekeurige veld een NOT NULL kolom is anders weet je niet zeker dat het resultaat is van de niet lukkende outer join.

  • Paitor
  • Registratie: Maart 2001
  • Laatst online: 08-05 23:14

Paitor

rages doen :P

Op zondag 07 april 2002 23:42 schreef RedDot het volgende:
Ik heb een probleempje met een query. Helaas kan ik geen sub-selects gebruiken want dan zou ik de oplossing al hebben:
code:
1
2
3
4
"SELECT DISTINCT gemeentenaam FROM gemeentecijfers WHERE gemeentenaam NOT IN 
(SELECT DISTICT gemeentenaam FROM gemeentecijfers, product 
WHERE product.datum BETWEEN '$begindatum' AND '$einddatum')
ORDER BY gemeentenaam ASC"
kan die niet zo:
code:
1
2
3
4
"SELECT DISTINCT gemeentenaam.product FROM gemeentecijfers, product
WHERE product.datum <> BETWEEN '$begindatum' AND '&einddatum'
AND product.gemeentenaam = gemeentecijfers.gemeentenaam
ORDER BY gemeentenaam ASC;

Kan zijn dat ik iets verkeerd heb gedaan, ik heb alleen sql geleerd en geen MySQL

Live Life to the Max | Kom op konijntje doe maar huppele wiebele


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Kan je je CREATE TABLE even posten (met klein beetje uitleg of hopelijk standaard commentaar). ik snap je tabellen structuur niet.

Verwijderd

Topicstarter
tabellenstructuur (ingekort)
code:
1
2
3
4
5
gemeentecijfers         |product
---------------         |-------------------
gemeentenaam (primary key)     |productsoort
inwoneraantal           |gemeentenaam
                     |datum

Ik heb hem sterk vereenvoudigd. De structuur veranderen is toch geen optie omdat er al een heel programma omheen is gebouwd en omdat ik vrij zeker ben van de juistheid.

In de tabel product kan dus een productsoort met verschillende gemeentenamen en verschillende data.

Ik ga meteen naar alle oplossingen kijken.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Toch gaan voor de outer join, maar alleen op gemeentenaam.
dan een group by uitvoeren op gemeentenaam en in de select opnemen:
code:
1
2
3
4
5
6
7
8
9
select gemeentecijfers.gemeentenaam
    ,max(iif( product.datum > '$begindatum' and 
            product.datum < '$einddatum'
          ,1,null
         )  ) product_boolean
from   hier de outer join opnemen
where  hier geen condities op datum opnemen
group by gemeentenaam
having   productboolean is null

Kijk maar even of je code begrijpt. Anders kan ik het ook nog wel uitleggen.

Verwijderd

Topicstarter
Op maandag 08 april 2002 09:58 schreef Paitor het volgende:

[..]

kan die niet zo:
code:
1
2
3
4
"SELECT DISTINCT gemeentenaam.product FROM gemeentecijfers, product
WHERE product.datum <> BETWEEN '$begindatum' AND '&einddatum'
AND product.gemeentenaam = gemeentecijfers.gemeentenaam
ORDER BY gemeentenaam ASC;

Kan zijn dat ik iets verkeerd heb gedaan, ik heb alleen sql geleerd en geen MySQL
Nee, precies hetzelfde probleem als bij de oplossing van Bigtree. Als er geen gemeentenaam staat in tabel product, dan wil ik hem toch hebben. Ik wil alle gemeentenamen die GEEN ENKELE KEER binnen die periode vallen. Dus ook als ze niet in de tabel product staan en wel in gemeentecijfers.

Zo, dit maakt het wel wat duidelijker.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Op maandag 08 april 2002 10:31 schreef RedDot het volgende:

[..]

Nee, precies hetzelfde probleem als bij de oplossing van Bigtree. Als er geen gemeentenaam staat in tabel product, dan wil ik hem toch hebben. Ik wil alle gemeentenamen die GEEN ENKELE KEER binnen die periode vallen. Dus ook als ze niet in de tabel product staan en wel in gemeentecijfers.

Zo, dit maakt het wel wat duidelijker.
Volgens mij doet mijn query dit allemaal. (wel outer joinen natuurlijk met product)

Verwijderd

Topicstarter
Ongelooflijk! Het werkt! Bedankt Goodielover!

Het juiste antwoord was:
code:
1
2
3
4
5
6
7
8
"SELECT DISTINCT gemeentecijfers.gemeentenaam, max
   (if(product.datum > '$begindatum' and product.datum < '$einddatum' ,1,null)) 
   product_boolean 
FROM gemeentecijfers 
LEFT OUTER JOIN product ON gemeentecijfers.gemeentenaam = product.gemeentenaam 
WHERE 
GROUP BY gemeentecijfers.gemeentenaam 
HAVING product_boolean is null"

En ik snap het ook nog :)

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Graag gedaan. Hoezo ongelooflijk :7.
[arro mode]No SQL problem I can't handle[/arro mode]
volgens mij kan het woord WHERE nog weg uit het statement en kan het ook nog zo (weet niet zeker of MySQL het aankan)
code:
1
2
3
4
5
6
7
8
SELECT gemeentecijfers.gemeentenaam
FROM   gemeentecijfers LEFT OUTER JOIN product
     ON gemeentecijfers.gemeentenaam = product.gemeentenaam
GROUP BY gemeentecijfers.gemeentenaam 
HAVING   max(if(product.datum > '$begindatum' and 
            product.datum < '$einddatum'
        ,1,null
        )  ) is null"

De Distinct is niet nodig omdat je al groupeert (die doet per definitie een distinct)

Verwijderd

Topicstarter
Aha, zo zit dat dus. Is het zo dat je het met een overbodige distinct veel langzamer maakt?

Ik probeer de andere manier ook wel even. Wie weet gaat het werken en leer ik er nog wat van. Maar is het zo moeilijk voor die lui van MySQL om gewoon subqueries in te bouwen?
Pagina: 1