[SQL] zoeken bij count = 0 in meerdere tabellen

Pagina: 1
Acties:

  • JTW
  • Registratie: September 2001
  • Laatst online: 22-11-2025
Ik heb de volgende tabellen:

tabel1 - hierin staat een hele reeks met namen van een selecte groep personen
naam
nummer

tabel2 - hieraan staan mensen die een bericht gepost hebben
bericht
nummer

(Dit zijn simpele weergaven van de echte tabellen, maar meer is voor deze query niet nodig)

Nu wil ik zien of er mensen zijn die geen berichten gepost hebben.
Ik kan natuurlijk met een heel simpele query zien wie er wel iets gepost hebben:
code:
1
2
3
4
SELECT a.naam, COUNT(*) 
FROM tabel1 a, tabel2 b 
WHERE (a.nummer = b.nummer) 
GROUP BY a.nummer


Maar nu komt (voor mij) de moeilijkheid.
Ik wil de mensen die in de resultaten van de vorige query voorkomen uit de volgende resultaten weren.
Ik moet dus op de een of andere manier duidelijk maken dat MySQL tabel1 doorloopt en voor elke persoon hieruit in tabel 2 kijkt of hij berichten heeft gepost.
Hoe krijg ik dit werkend?

b.v.d. voor jullie hulp.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Als je in een query alleen mensen wilt opnemen die minimaal 1 bericht gepost hebben moet je een INNER JOIN doen met Tabel2.

Voor meer informatie Hoe werken joins in de P&W FAQ

Oops! Google Chrome could not find www.rijks%20museum.nl


  • JTW
  • Registratie: September 2001
  • Laatst online: 22-11-2025
P_de_B schreef op maandag 28 november 2005 @ 20:39:
Als je in een query alleen mensen wilt opnemen die minimaal 1 bericht gepost hebben moet je een INNER JOIN doen met Tabel2.

Voor meer informatie Hoe werken joins in de P&W FAQ
Ja, maar dat had ik dus al(zie mijn code).
Ik zoek dus mensen die niet nog geen bericht hebben gepost.

Verwijderd

Lijkt me een typisch geval om even te zoeken naar outer-joins.
Ken geen MySQL, maar op de manier waarop je je query maakt iets van a.nummer *= b.nummer.
En daarna filteren op "b.nummer is null".

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
JTW schreef op maandag 28 november 2005 @ 20:41:
[...]

Ja, maar dat had ik dus al(zie mijn code).
Ik zoek dus mensen die niet nog geen bericht hebben gepost.
Dan moet je dus LEFT OUTER JOIN doen in plaats van INNER JOIN, en controleren op NULL in de tabel 2.

code:
1
2
3
4
SELECT *
FROM Tabel1 T1
LEFT OUTER JOIN Tabel2 T2 ON T1.Nummer = T2.Nummer
WHERE T2.Nummer IS NULL

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 22-04 17:52

Dido

heforshe

JTW schreef op maandag 28 november 2005 @ 20:32:
Maar nu komt (voor mij) de moeilijkheid.
Ik wil de mensen die niet in de resultaten van de vorige query voorkomen uit de volgende resultaten weren.
Ik moet dus op de een of andere manier duidelijk maken dat MySQL tabel1 doorloopt en voor elke persoon hieruit in tabel 2 kijkt of hij berichten heeft gepost.
Hoe krijg ik dit werkend?

b.v.d. voor jullie hulp.
Als je die lijst van niet-posters wilt kan dat met een left outer join en een test op NULL.

Maar als je, zoals je zegt, die personen niet in andere resultaten (van queries?) mee wilt nemen, kun je in die queries doodeenvoudig een inner join op je tweede tabel meenemen. Dan neem je de niet-posters automatisch niet mee.

Wat betekent mijn avatar?


  • JTW
  • Registratie: September 2001
  • Laatst online: 22-11-2025
Dido schreef op maandag 28 november 2005 @ 20:49:
[...]

Als je die lijst van niet-posters wilt kan dat met een left outer join en een test op NULL.

Maar als je, zoals je zegt, die personen niet in andere resultaten (van queries?) mee wilt nemen, kun je in die queries doodeenvoudig een inner join op je tweede tabel meenemen. Dan neem je de niet-posters automatisch niet mee.
Oh, ik had het een beetje verkeerd geformuleerd zie ik nu. Sorry voor de ontstane verwarring.

Ik had nog niet gehoord van left outer joins, dus dat helpt. Ik bekijk nu even of ik een werkende query voor elkaar krijg.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Of je kan iets doen met een sub-query
SQL:
1
2
3
select *
from tabel1 t1
where t1.nummer not int ( select t2.nummer from tabel2 t2 )

Maar aangezien je mysql gebruikt zal je eerst moeten kijken of jouw versie sub-queries ondersteund.

[ Voor 3% gewijzigd door Woy op 29-11-2005 10:27 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1