Mysql Join issue

Pagina: 1
Acties:

Anoniem: 152426

Topicstarter
Goede avond,

Ik ben bezig met een tweetal tabellen waaruit ik vooralsnog niet de juiste data kan opvragen op basis van 1 query.
Het gaat om het volgende in een versimpliceerde versie.

Ik heb een tweetal tabellen: ITEM

item_iditem_user_iditem_cat
11televisie
21film
32theater
41theater


en TAGS

tag_idtag_user_idtag_cattag_title
11filmfilmhuis
22theatercabaret
31theaterdans


Ik heb dus 3 items van user 1.
Deze items wil ik ophalen met bijbehorende tags :

item_iditem_user_iditem_cattag_idtag_user_idtag_cattag_title
11televisienull null null null
21film11filmfilmhuis
41theater31 theaterdans


Hier loop ik dus vast.

code:
1
SELECT * FROM item LEFT JOIN tags ON tags.tag_cat = item.item_cat

geeft me nl. dubbele items voor item 4 omdat er 2 joins zijn op cat theater.

Zo iets simpels maar ik staar me weer suf... te lang gewerkt vandaag gok ik 8)7

  • Salmon
  • Registratie: Juli 2009
  • Laatst online: 10-06 08:15

Salmon

.NET developer

Joinen op tag user id en item user id? Of horen die niet samen?

Je moet iig twee tabellen hebben die overeenkomen, volgens mij werkt t niet als de twee tabellen waarop je join ongelijk aan t aantal rijen zijn oid

[ Voor 70% gewijzigd door Salmon op 18-12-2014 00:07 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
SQL:
1
2
3
4
5
SELECT * 
FROM item 
LEFT JOIN tags 
    ON tags.tag_cat = item.item_cat
    AND tags.tag_user_id = item.item_user_id

Gewoon je JOIN conditie uitbreiden dat hij alleen joint waar jij dat wil?

In jouw voorbeeld zijn er inderdaad twee rows die aan je join conditie voldoen, en dus zul je twee rows terug krijgen. Je zult dus of je join conditie moeten verfijnen, of eventueel iets met GROUP BY en een een aggregate doen om de juiste waardes te kiezen

[ Voor 39% gewijzigd door Woy op 18-12-2014 09:09 ]

“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.”


Anoniem: 152426

Topicstarter
Woy,

dat was 'm bijna.
Ik was me nooit bewust van het feit dat ik de join conditie ook nog kon uitbreiden.
Ik zocht dat altijd in een uitbreiding van mijn WHERE statement zoals hieronder te zien.

Er zit nog wel een maar:

code:
1
2
3
4
5
SELECT * 
FROM item 
LEFT JOIN tags 
    ON tags.tag_cat = item.item_cat
    AND tags.tag_user_id = item.item_user_id


wil ik eigenlijk nog uitbreiden zodat alle items die als joined cat_title "dans" hebben niet meegenomen worden in de resultaten.

code:
1
2
3
4
5
6
SELECT * 
FROM item 
LEFT JOIN tags 
    ON tags.tag_cat = item.item_cat
    AND tags.tag_user_id = item.item_user_id
WHERE cat_title != 'dans"


Door de WHERE statement worden alle items die geen tag hebben niet meegenomen in de resultaten.

Daarvoor moet ik dan mijn query nog uitbreiden dat NULL ook wordt geaccepteerd.

code:
1
2
3
4
5
6
SELECT * 
FROM item 
LEFT JOIN tags 
    ON tags.tag_cat = item.item_cat
    AND tags.tag_user_id = item.item_user_id
WHERE (cat_title != 'dans" OR cat_id IS NULL)


Dan werkt t wel!

[ Voor 89% gewijzigd door Anoniem: 152426 op 18-12-2014 11:31 ]


Acties:
  • 0 Henk 'm!

  • Wasp
  • Registratie: Maart 2001
  • Laatst online: 10-07 17:22
Je kan de WHERE ook verplaatsen naar de JOIN clause.

Dus:
code:
1
2
3
4
5
SELECT * 
FROM item 
LEFT JOIN tags 
    ON tags.tag_cat = item.item_cat AND tags.cat_title != 'dans'
    AND tags.tag_user_id = item.item_user_id

Ryzen 9 5900X, MSI Tomahawk MAX, 32GB RAM, Nvidia RTX 4070 Ti | Mijn livesets