Toon posts:

[MySQL] Ingewikkelde query

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi, ik ben nu aan het worstelen met zo'n vervelende query waarbij je niet weet of je nou een join moet gebruiken of niet, en zo ja welke. :D

De situatie is als volgt:

mails
ID
ID_user_to
ID_clan_to

users
ID

clans
ID

clan_members
ID_clan
ID_user


Nu probeer ik een query te maken, waarin ik de ID's van alle mails krijg, die zijn verstuurd naar een user met een gegeven ID (in dit geval neem ik als voorbeeld 5), of naar een clan waarvan de betreffende user een 'member' is.

Ik ben zelf niet verder gekomen dan:

code:
1
2
3
4
5
6
7
8
9
10
11
SELECT ma.ID
  FROM mails AS ma
  INNER JOIN users AS u
  INNER JOIN clans AS c
  INNER JOIN clan_members AS me
ON ma.ID_user_to=5
  OR (
  ma.ID_clan_to=me.ID_clan
  AND
  me.ID_user=5
  )

Maar dit werkt bij mij niet.
Iemand suggesties? Alvast bedankt! :)

[ Voor 4% gewijzigd door Verwijderd op 13-06-2005 20:31 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
Als je het id van de user al hebt, dan hoef je helemaal niet te joinen met de users tabel.

Wat je dus zeker moet doen is dit:
code:
1
2
3
select bliep
from mails
where id_user_to = 5

Nu moet je er nog voor zorgen dat je ook de clans hebt waar die user lid van is, en in één query gieten.
code:
1
2
3
4
5
6
7
select mails.* from mails where id_user_to = 5
union
select mails.* 
from mails 
inner join users on ...
inner join clans on ...
where user_id = 5


Zo iets zal het ongeveer moeten zijn.

Evt kan je van die union een union all maken, zodanig dat de dubbels eruit gefiltert worden.

[ Voor 9% gewijzigd door whoami op 13-06-2005 20:21 ]

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Is het juist niet zo dat een UNION ALL de dubbele er niet uit haalt? Volgens mij is default gedrag van een UNION alle dubbele eruit te halen, en moet je ALL gebruiken als je de dubbele wilt bewaren.

Voor de rest wel eens :)

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


Verwijderd

Topicstarter
Van UNION had ik nog nooit gehoord. :)

In ieder geval, het is wel een slimme aanpak om de queries eerst te scheiden, dus ik heb nu eerst deze queries gemaakt:

code:
1
SELECT m.ID AS ID FROM mails AS m WHERE m.ID_user_to=1


En voor de clans:

code:
1
2
3
4
SELECT m.ID AS ID FROM mails AS m
INNER JOIN clan_members AS c
ON m.ID_clan_to=c.ID_clan
AND c.ID_user=1


Dus een UNION zou dit worden:

code:
1
2
3
4
5
6
SELECT m.ID AS ID FROM mails AS m WHERE m.ID_user_to=1
UNION
SELECT m.ID AS ID FROM mails AS m
INNER JOIN clan_members AS c
ON m.ID_clan_to=c.ID_clan
AND c.ID_user=1


Echter, dit selecteert weer helemaal niets. :(

Correctie: dit doet het wél! De UNION was inderdaad de oplossing.
En whoami: P_de_B had gelijk; UNION ALL toont júist alle dubbelen terwijl UNION deze eruit filtert. :)
Heel erg bedankt allebei!

[ Voor 14% gewijzigd door Verwijderd op 13-06-2005 20:37 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
P_de_B schreef op maandag 13 juni 2005 @ 20:27:
Is het juist niet zo dat een UNION ALL de dubbele er niet uit haalt? Volgens mij is default gedrag van een UNION alle dubbele eruit te halen, en moet je ALL gebruiken als je de dubbele wilt bewaren.

Voor de rest wel eens :)
Eh, ja, 't zou ook kunnen. :P


Beide queries apart geven wel iets terug ?

[ Voor 7% gewijzigd door whoami op 13-06-2005 20:37 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op maandag 13 juni 2005 @ 20:36:
[...]


Eh, ja, 't zou ook kunnen. :P


Beide queries apart geven wel iets terug ?
Kijk mijn vorige bericht ;).

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 19-04 22:55
Wat mij "meer logisch" lijkt is dat je, je DB structuur aanpast. En je bij de member een "clan_id" zet zo is je query ook veel rapper opgelost.

Want dan moet je gewoon kijken naar de emails waar "member_id" & "clan_id" in voorkomen en dan heb je alle mails die verzonden zijn naar die member, of als je met een OR zou werken dan krijg je alle mails die naar die member zijn verstuurd en naar die clan.
Misschien moet je bij dat laatste wel even opletten voor dubbels, 'k weet het niet zeker.

[ Voor 16% gewijzigd door imp4ct op 13-06-2005 23:59 ]

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 05-05 11:52

Eelke Spaak

- Vlad -

I_M_P_A_C_T schreef op maandag 13 juni 2005 @ 23:58:
Wat mij "meer logisch" lijkt is dat je, je DB structuur aanpast. En je bij de member een "clan_id" zet zo is je query ook veel rapper opgelost.

Want dan moet je gewoon kijken naar de emails waar "member_id" & "clan_id" in voorkomen en dan heb je alle mails die verzonden zijn naar die member, of als je met een OR zou werken dan krijg je alle mails die naar die member zijn verstuurd en naar die clan.
Misschien moet je bij dat laatste wel even opletten voor dubbels, 'k weet het niet zeker.
Waarschijnlijk heeft de clans table ook nog andere informatie, naast clan_ID. Wanneer je dan een veel-op-veel relatie wil hebben heb je wel een linktable nodig, zoals WalfredGeesink ook gebruikt.

TheStreme - Share anything with anyone


Verwijderd

Topicstarter
I_M_P_A_C_T schreef op maandag 13 juni 2005 @ 23:58:
Wat mij "meer logisch" lijkt is dat je, je DB structuur aanpast. En je bij de member een "clan_id" zet zo is je query ook veel rapper opgelost.

Want dan moet je gewoon kijken naar de emails waar "member_id" & "clan_id" in voorkomen en dan heb je alle mails die verzonden zijn naar die member, of als je met een OR zou werken dan krijg je alle mails die naar die member zijn verstuurd en naar die clan.
Misschien moet je bij dat laatste wel even opletten voor dubbels, 'k weet het niet zeker.
Het is niet op het eerste gezicht duidelijk, maar het is de bedoeling dat 1 user van meerdere clans 'lid' kan zijn.

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 19-04 22:55
Verwijderd schreef op dinsdag 14 juni 2005 @ 12:02:
[...]

Het is niet op het eerste gezicht duidelijk, maar het is de bedoeling dat 1 user van meerdere clans 'lid' kan zijn.
Ah, ok :). Dat was mij idd niet echt duidelijk. Dan is mijn oplossing inderdaad niet echt een grote hulp.

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-05 14:03

curry684

left part of the evil twins

P_de_B schreef op maandag 13 juni 2005 @ 20:27:
Is het juist niet zo dat een UNION ALL de dubbele er niet uit haalt? Volgens mij is default gedrag van een UNION alle dubbele eruit te halen, en moet je ALL gebruiken als je de dubbele wilt bewaren.
Klopt exact. In MySQL mag je voor het default effect ook UNION DISTINCT gebruiken, maar dat slikt bijv. SQL Server niet, dus kun je beter gewoon zonder DISTINCT doen.

Professionele website nodig?

Pagina: 1