FAQ |
Kalender |
2013-08-14, 02:20 | #1 | |||
|
||||
Mycket flitig postare
|
I brist på terminologi så vill jag välja de rader i t1 som har associerade rader i t3 som uppfyller godtyckligt antal villkor.
Kod:
SELECT t1.* FROM `t1` LEFT JOIN t2 ON t1.a=t2.b LEFT JOIN t3 ON t2.a=t3.b WHERE t3.c IN ('this','also') AND t3.c IN ('that','too') AND ... GROUP BY t1.a ORDER BY t1.d ASC Kod:
WHERE t3.c IN ('this','also') Några tips? |
|||
Svara med citat |
2013-08-14, 08:56 | #2 | ||
|
|||
Medlem
|
Normalt sett tillåter ju en left join att ta med t1 i ditt fall även om inget i t3 matchar.
Men i med att du lägger ett villkor under den normala WHERE satsen som gäller för t3, så får du inga resultat från t1 heller. Du kan i LEFT join ON köra ON t3.rel_id = t1.id AND t3.c IN ('that', 'too') På så sätt får du bara t3-resultat som matchar villkoren du satt för t3-joinen. |
||
Svara med citat |
2013-08-14, 13:28 | #3 | |||
|
||||
Mycket flitig postare
|
Jag var nog inte tydlig i min fråga. Låt mig visa ett exempel. Anta att jag har tre tabeller:
products Kod:
ID | name | price 1 Fiat Panda 2500 2 VW Golf 3500 3 Peugot 2008 4200 4 Peugot 2008 4800 Kod:
ID | product_id | property_id 1 1 1 2 1 4 3 2 3 4 2 4 5 3 2 6 3 6 6 4 1 6 4 6 Kod:
ID | property_group |value 1 color red 2 color green 3 color blue 4 type compact 5 type SUV 6 type crossover Kod:
1 Fiat Panda 2500 4 Peugot 2008 4800 Kod:
3 Peugot 2008 4200 |
|||
Svara med citat |
2013-08-14, 15:14 | #4 | ||
|
|||
Medlem
|
Jag missförstod dig lite. Men tror följande blir rätt.
Kod:
SELECT * FROM products P LEFT JOIN product_properties PP ON PP.product_id = P.ID LEFT JOIN property_values PV ON PV.ID = PP.property_ID WHERE PV.ID IN(1,6) |
||
Svara med citat |
2013-08-15, 12:58 | #5 | |||
|
||||
Mycket flitig postare
|
Problemet är att den lösningen har en OR-logik. Den listar de produkter som är röda ELLER är crossover. Jag behöver de produkter som har egenskap 1 OCH egenskap 2 OCH egenskap 3..., eller snarare de produkter som har egenskap_array_1 OCH egenskap_array_2 o.s.v.
T.ex. vill jag i mitt filter vill se alla bilar som är blå ELLER röda OCH som är av typen crossover ELLER SUV... |
|||
Svara med citat |
2013-08-15, 13:11 | #6 | ||
|
|||
Medlem
|
Kod:
SELECT * FROM products P LEFT JOIN product_properties PP ON PP.product_id = P.ID LEFT JOIN property_values PV ON PV.ID = PP.property_ID WHERE property_values.value = 'crossover' AND property_values.value = 'red'; |
||
Svara med citat |
2013-08-15, 15:02 | #7 | |||
|
||||
Mycket flitig postare
|
Citat:
Jag tror dock att jag är en lösning på spåren: Kod:
SELECT bp.ID FROM `base_products` bp JOIN product_properties pp ON pp.product_id=bp.ID JOIN product_properties_values ppv ON pp.property_value_id = ppv.ID WHERE ppv.value IN ('16','21') OR ppv.value IN ('blå') GROUP BY ID HAVING COUNT(*) = 2 Kod:
GROUP BY ID HAVING COUNT(*) = 2 |
|||
Svara med citat |
2013-08-15, 15:55 | #8 | ||
|
|||
Medlem
|
Du kan inte dela upp det i fler queries..?
alltså typ 1. select from product_properties where.. 2. ta bort duplicerade product id 3. select from products where id IN(...) Personligen tycker jag joins blir så komplext |
||
Svara med citat |
2013-08-15, 16:43 | #9 | |||
|
||||
Mycket flitig postare
|
Citat:
Dock funkar lösningen enligt ovan, den gör precis det jag ville att den ska göra. |
|||
Svara med citat |
2013-08-15, 20:32 | #10 | ||
|
|||
Medlem
|
Om du kör PV.ID IN (1,2,3,4,5,6) så får du ju alla resultat möjliga.
Mellan varje siffra är ju ett OR, så du ska därmed få varje matchande. Blir det inte så, så är det ju konstigt |
||
Svara med citat |
Svara |
|
|