[SQL] Join query geeft geen uitvoer.

Pagina: 1
Acties:

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025
Hallo!

Ik ben hier bezig met 2 tabellen, eentje met alle apparaatjes erin, en een met alle reserveringen voor die apparaten. Omdat het een testfase is, staan alle apparaten er ook werkelijk in, en maar 1 reservering, voor een hele lange tijd.

De bedoeling is dat ik alle niet gebruikte devices op een bepaalde tijd kan uitvoeren, dus ik heb dit gemaakt:
SQL:
1
2
3
4
5
6
7
SELECT a.type, a.naam, a.id
FROM devices a, reservering b
WHERE (a.type = 'laptop')
AND b.devid = a.id
AND NOT (((1081334314 > b.van) AND (1081334314 < b.tot))
OR ((1081418314 > b.van) AND (1081418314 < b.tot)))
ORDER BY a.type ASC;


Het zou moeten werken (met mijn roestige SQL kennis :)) maar dat doet hij dus duidelijk niet.

Iemand een idee hoe ik het wel werkend krijg?
Alle relevante columns staan in het script vermeld en ja, de naam 'type' is inderdaad gereserveerd. Als dat het probleem is mag je me spanken.

Van het gesloten topic net, Hij geeft dus geen uitvoer van alle beschikbare apparaten, oftewel ieder apparaat dat op dat tijdstip geen geregistreerde reservering heeft staan.

edit:
Whoami: een NOT (..) herschrijven zou allicht kunnen, ik heb alleen wat dat betreft blijkbaar niet genoeg kennis van SQL dus ik probeer het op de manier zoals ik het ken. Als iemand een betere manier heeft, graag!

[ Voor 12% gewijzigd door GX op 07-04-2004 12:57 ]


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025
Eigenlijk is het ook logisch dat ik niets krijg, want de record staat niet in de 2e tabel..

Waarom denk ik daar nu pas aan?
In hoeverre kan ik nu kijken of een record daar dus niet bestaat? (in de tussentijd buffel ik ook wel verder)

  • whoami
  • Registratie: December 2000
  • Laatst online: 13:37
kijk eens naar OUTER JOINS. (Zie ook de P&W FAQ).
Je zou die query zowiezo beter herschrijven, zodat er geen NOT gebruikt wordt, want die NOT kan er voor zorgen dat je query geen indexen gebruikt.
Dat heeft ook helemaal niets met sql kennis te maken, maar met logisch nadenken.

Oja, er bestaat natuurlijk ook nog zoiets als een edit-knop.

https://fgheysels.github.io/


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 10:06
Ten eerste is dit geen echte join maar een select uit twee tabellen ;).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SELECT
  a.type, 
  a.naam, 
  a.id
FROM
  devices a, 
  reservering b
WHERE
  (
    a.type = 'laptop'
  )
AND 
  b.devid = a.id
AND NOT 
  (
    (
      (1081334314 > b.van)
    AND
      (1081334314 < b.tot)
    )
  OR
    (
      (1081418314 > b.van)
    AND
      (1081418314 < b.tot)
    )
  )
ORDER BY 
  a.type ASC;

Het is inderdaad een heel lastig dilemma dit, maar ik denk dat je bijna wel met subqueries moet gaan werken. Want technisch gezien moet je eerst weten welke reserveringen er allemaal WEL zijn binnen de tijdstippen die je noemt en daarna moet je gewoon alle apparaten waarvan er WEL reserveringen zijn gewoon uit je lijstje filteren.

Zoals whoami zegt kan het misschien ook met OUTER JOINS, maar daar heb ik geen idee van :).

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025
ddc schreef op 07 april 2004 @ 13:07:
Ten eerste is dit geen echte join maar een select uit twee tabellen ;).
[...]
Het is inderdaad een heel lastig dilemma dit, maar ik denk dat je bijna wel met subqueries moet gaan werken. Want technisch gezien moet je eerst weten welke reserveringen er allemaal WEL zijn binnen de tijdstippen die je noemt en daarna moet je gewoon alle apparaten waarvan er WEL reserveringen zijn gewoon uit je lijstje filteren.

Zoals whoami zegt kan het misschien ook met OUTER JOINS, maar daar heb ik geen idee van :).
Ik ben inderdaad ook met subqueries aan de slag gegaan, maar het is en blijft MySQL.. :)

Ik ben nu aan het buffelen met joins, maar echt ver komt 't nog niet..

  • whoami
  • Registratie: December 2000
  • Laatst online: 13:37
ddc schreef op 07 april 2004 @ 13:07:
Ten eerste is dit geen echte join maar een select uit twee tabellen ;).
:?
Waarom zou dat geen JOIN zijn?
Omdat er geen JOIN clause in staat zeker? Dat is onzin. Als je joined met een join clause, of in de where, dat maakt niet uit. Het is een join.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:37
Als je alle apparaten wilt, die niet gereserveerd zijn zal je idd met een subquery moeten werken.

https://fgheysels.github.io/


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Als jouw filters e.d. kloppen dan denk ik dat je zoiets zoekt:

code:
1
2
3
4
5
6
7
8
9
SELECT a.type, a.naam, a.id
FROM devices a
LEFT OUTER JOIN reservering b ON (b.devid = a.id
                                AND NOT (((1081334314 > b.van) AND (1081334314 < b.tot))
                                OR ((1081418314 > b.van) AND (1081418314 < b.tot)))

WHERE (a.type = 'laptop')
AND b.devid IS NULL
ORDER BY a.type ASC


Een subquery heb je in ieder geval niet nodig.

[ Voor 4% gewijzigd door cameodski op 07-04-2004 13:38 . Reden: AND b.devid IS NOT NULL moet natuurlijk AND b.devid IS NULL zijn ]

Never underestimate the power of


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 10:06
whoami schreef op 07 april 2004 @ 13:16:
:?
Waarom zou dat geen JOIN zijn?
Omdat er geen JOIN clause in staat zeker? Dat is onzin. Als je joined met een join clause, of in de where, dat maakt niet uit. Het is een join.
Ok :).
whoami schreef op 07 april 2004 @ 13:18:
Als je alle apparaten wilt, die niet gereserveerd zijn zal je idd met een subquery moeten werken.
Ik was er al bang voor ;).

Als je MySQL gebruikt ben je dus goed de l*l en zul je met tijdelijke tabellen moeten werken.

  • whoami
  • Registratie: December 2000
  • Laatst online: 13:37
ddc schreef op 07 april 2004 @ 13:29:
[...]

Als je MySQL gebruikt ben je dus goed de l*l en zul je met tijdelijke tabellen moeten werken.
Nee, je kan -als je een subquery nodig hebt- je query herschrijven zoals cameodski doet.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:37
cameodski schreef op 07 april 2004 @ 13:29:
Als jouw filters e.d. kloppen dan denk ik dat je zoiets zoekt:

code:
1
2
3
4
5
6
7
8
9
SELECT a.type, a.naam, a.id
FROM devices a
LEFT OUTER JOIN reservering b ON (b.devid = a.id
                                AND NOT (((1081334314 > b.van) AND (1081334314 < b.tot))
                                OR ((1081418314 > b.van) AND (1081418314 < b.tot)))

WHERE (a.type = 'laptop')
AND b.devid IS NOT NULL
ORDER BY a.type ASC


Een subquery heb je in ieder geval niet nodig.
Dat is eigenlijk een work-around om geen subquery te gebruiken. 't Resultaat is hetzelfde.

https://fgheysels.github.io/


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025
Subquery's doen het niet, het is nog MySQL 4.0.18, helaas. (kom ik net achter :|)
En de query van Cameodski werkt ook niet:

code:
1
2
3
4
#1064 - You have an error in your SQL syntax.
Check the manual that corresponds to your MySQL server
version for the right syntax to use near
'WHERE ( a.type =  'laptop' ) AND b.devid IS  NOT  NULL ORDER


Ook denk ik niet dat dit het resultaat oplevert wat ik wil, het gaat erom dat ik juist alles krijg uit tabel a, en niet uit b.

Ik doe het nu ernstig omslachtig met 2 verschillende queries en ik zie van de week wel weer of ik het goedkrijg.

Bedankt in ieder geval voor alle hulp tot dusver. :*

[ Voor 4% gewijzigd door GX op 07-04-2004 13:40 . Reden: enter enter enter enter ]


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
OK, dan nog even een poging om nog wat tikfoutjes/vergissingen eruit te halen

code:
1
2
3
4
5
6
7
8
9
SELECT a.type, a.naam, a.id
FROM devices a
LEFT OUTER JOIN reservering b ON (b.devid = a.id
                                AND NOT (((1081334314 > b.van) AND (1081334314 < b.tot))
                                OR ((1081418314 > b.van) AND (1081418314 < b.tot))))

WHERE (a.type = 'laptop')
AND b.devid IS NULL
ORDER BY a.type ASC

[ Voor 6% gewijzigd door cameodski op 07-04-2004 13:43 ]

Never underestimate the power of


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:37
GX, hier wordt niet altijd (zeer zelden zelfs) code gepost die je maar hoeft te copy / pasten.
Het is de bedoeling dat je er zelf ook wat uit leert, dus er kunnen altijd foutjes in sluipen. Doe dan ff de moeite om zelf ook eens naar de eventuele syntaxfout te zoeken.

https://fgheysels.github.io/


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025
whoami schreef op 07 april 2004 @ 13:46:
GX, hier wordt niet altijd (zeer zelden zelfs) code gepost die je maar hoeft te copy / pasten.
Het is de bedoeling dat je er zelf ook wat uit leert, dus er kunnen altijd foutjes in sluipen. Doe dan ff de moeite om zelf ook eens naar de eventuele syntaxfout te zoeken.
Whoami, ik weet niet wat voor een beeld je van me hebt. maar het is in ieder geval incorrect. Ik weet dat ik niet hoef te copy pasten, en ik weet ook dat ik hier niet vanmiddag pas mezelf aangemeld heb om er maar op los te posten. Ik zit me hier al veel te lang over te breken, en MySQL wil ook niet meewerken.

Echter ik heb nu een omslachtige oplossing, 2 losstaande queries en een while loopje die de kijkt welk apparaat ik kan koppelen aan een gebruiker. Op deze manier werkt het (al dan niet erg soepel, maar er word niet verwacht dat er heel erg intensief van gebruikt gaat worden).

die laatste doet het idd al beter.. Maar ik ben dit even zat, er is nog genoeg te doen, ik kijk er morgen wel weer naar.
Pagina: 1