[MySQL] lastige query die ik niet goed krijg

Pagina: 1
Acties:

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 09:38
Ik heb voor een planner deze tabellen:

events(id, naam, tijd, minusers)
subscriptions(id, userid, eventid, comment)
users(id, nickname)

en deze code om een overzicht

(naam, tijd, minusers, organisator, aantalinschrijvingen) te creeeren.

SQL:
1
2
3
4
5
6
7
8
SELECT e.id, e.naam, e.tijd, e.minusers, u.nickname AS organisator, COUNT( s.id ) AS aantalinschrijvingen
FROM `events` AS e
INNER JOIN `users` AS u ON e.organisator = u.id
RIGHT JOIN `subscriptions` AS s ON e.id = s.eventid
WHERE s.doetmee = 'Ja' <-- lelijk ik weet, wordt nog veranderd.
AND e.tijd > 1
GROUP BY e.id
ORDER BY e.id DESC


Echter als ik subscriptions right join, komt er onzin uit (de organisatoren worden NULL en de subscriptions worden overal 332) en als ik inner- of leftjoin zie ik wat ik wil zien, met uitzondering van nieuwe events, omdat deze nog geen subscriptions hebben. Waarna niemand zich uberhaupt kan inschrijven 8)7.

Hoe pas ik mijn query zo aan dat hou wat ik nu heb, maar bovendien de events die nog geen inschrijvingen hebben ook opneem in de outcome?

There is no replacement for displacement!


Verwijderd

1) Je group by is niet goed P&W FAQ - SQL
2) Als je LEFT JOIN doet op subscriptions zou je events + users moeten krijgen waarvoor geen subscription is, precies wat je zoekt. Mis je deze records gewoon helemaal?

Edward heeft idd de oplossing, imho is de query dus niet zo lastig.

Met een INNER JOIN of RIGHT JOIN krijg je inderdaad niet wat je wilt. Het is wellicht beter om te weten wat je doet ipv alles maar uit te proberen.

[ Voor 31% gewijzigd door Verwijderd op 03-04-2007 16:43 ]


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
LEFT JOIN zou hier de juiste oplossing moeten zijn... als de gejoinde tabel echter geen corresponderende waarden heeft, worden die waarden in je resultaat weergegeven als NULL... dat is op zich ook goed, alleen als jij dan in je WHERE statement specifieke waarden uit de gejoinde tabel wil hebben (s.doetmee = 'Ja' ) dan gaat het fout... want NULL is ongelijk aan "Ja"

doe dan zoiets als (s.doetmee = 'Ja' OR s.doetmee IS NULL)

[ Voor 3% gewijzigd door P.O. Box op 03-04-2007 16:42 ]


  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 09:38
Edwardvb schreef op dinsdag 03 april 2007 @ 16:41:
LEFT JOIN zou hier de juiste oplossing moeten zijn... als de gejoinde tabel echter geen corresponderende waarden heeft, worden die waarden in je resultaat weergegeven als NULL... dat is op zich ook goed, alleen als jij dan in je WHERE statement specifieke waarden uit de gejoinde tabel wil hebben (s.doetmee = 'Ja' ) dan gaat het fout... want NULL is ongelijk aan "Ja"

doe dan zoiets als (s.doetmee = 'Ja' OR s.doetmee IS NULL)
SQL:
1
2
3
4
5
6
7
8
SELECT e.id, e.naam, e.tijd, e.minusers, u.nickname AS organisator, COUNT(s.id) AS inschrijvingen
FROM `events` AS e 
INNER JOIN `users` AS u ON e.organisator = u.id 
LEFT JOIN `subscriptions` AS s ON e.id = s.eventid
WHERE s.doetmee = 'Ja' OR s.doetmee = 'NULL'
AND e.tijd > $tijd
GROUP BY e.id
ORDER BY e.tijd ASC


Doet hetzelfde, lege events verschijnen nog steeds niet. Die $tijd wordt door PHP ingevuld btw.
Verwijderd schreef op dinsdag 03 april 2007 @ 16:41:
1) Je group by is niet goed P&W FAQ - SQL
2) Als je LEFT JOIN doet op subscriptions zou je events + users moeten krijgen waarvoor geen subscription is, precies wat je zoekt. Mis je deze records gewoon helemaal?

Edward heeft idd de oplossing, imho is de query dus niet zo lastig.

Met een INNER JOIN of RIGHT JOIN krijg je inderdaad niet wat je wilt. Het is wellicht beter om te weten wat je doet ipv alles maar uit te proberen.
Jup deze komen er niet in voor.

/edit
Ik ga even andere groups proberen, kijken ofi k dan ergens kom.

[ Voor 5% gewijzigd door _eXistenZ_ op 03-04-2007 16:50 ]

There is no replacement for displacement!


Verwijderd

8)7 8)7 8)7 Niet = 'NULL' maar IS NULL...

Even goed lezen is ook een vak.

http://en.wikipedia.org/wiki/Null_(SQL)

Andere groups proberen? Je moet gewoon groeperen op alle velden die niet in je aggregate (in dit geval de COUNT) functie zitten... Dus: group by e.id, e.naam, e.tijd, e.minusers, u.nickname

[ Voor 65% gewijzigd door Verwijderd op 03-04-2007 16:52 ]


  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 09:38
w00h000TTT hij doet nu idd wattie moet doen :D w0000TTTT!!!


*another happy customer

There is no replacement for displacement!


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
als je een OR en een AND hebt, zou ik wel even haakjes gaan gebruiken als ik jou was...

en snap je trouwens ook waarom het nu wel werkt? ;)

[ Voor 24% gewijzigd door P.O. Box op 03-04-2007 19:22 ]


  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 09:38
Haakjes heb ik inderdaad gedaan en ik snap waarom het nu werkt ja :) Thx.

There is no replacement for displacement!

Pagina: 1