FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Flitig postare
|
Har en lurig MySQL-fråga jag inte får ordning på!
Jag har två tabeller som har samma två fält (ID och Value). Jag vill ta ut de rader ur tabell 1 vars ID finns någonstans i tabell 2 men där kombinationen av ID och Value inte finns. Tabell1: ID Value ----------------------- 1 Green 1 Red 1 Blue 2 Red 2 Green 2 Brown Tabell2: ID Value ---------------------- 1 Red 1 Green Jag vill alltså få ut enbart den tredje raden i tabell 1 eftersom "ID = 1" finns i tabell 2 men inte kombinationen "ID=1, Value=Blue". Eftersom ID=2 inte finns i tabell 2 så skall de raderna inte finnas i resultatet. Några förslag? |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Klarade millennium-buggen
|
SELECT * FROM Tabell1 t1 WHERE t1.ID IN (
SELECT t2.ID FROM Tabell2 t2 WHERE NOT t1.`value` = t2.`value` ) Kanske?! |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Flitig postare
|
Nja, jag testade men då fick jag med rader som inte finns i tabell 2 (rad 5 och 6).
Kan man "joina" på två kolumner i MySQL, alltså två "ON"? |
||
![]() |
![]() |
![]() |
#4 | |||
|
||||
Medlem
|
Kod:
SELECT * FROM tabell1 where ID IN (SELECT ID FROM tabell2) AND Value NOT IN (SELECT Value FROM tabell2) |
|||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Flitig postare
|
chrizz:
Problemet är att samma värde kan förekomma för olika ID. Om vi lägger till raden "2 Blue" i båda tabellerna så kommer ju "1 Blue" inte hamna i resultatet, "SELECT Value FROM tabell2" kommer ju innehålla "Blue". Jag antar att man måste köra ngn slags JOIN så att ID och Value paras ihop rätt och sedan ta ut de rader där tabell 2 har NULL för Value... hmm... jag kanske har något där... |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Flitig postare
|
Uuuusch vad detta blev fult, men det gör jobbet iaf. Nåt att snygga till : )
Kod:
select t1.id, t1.value from t1 where t1.id in (select distinct t1.id from t1 join t2 on t1.id = t2.id) and t1.value not in (select value from t2); |
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Supermoderator
|
Är det små eller stora tabeller? Är de större så är det nog bättre att göra en del av detta i php-koden istället.
__________________
Full-stack developer, free for smaller assignments |
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Flitig postare
|
Tabellerna är stooora... tyvärr.
Perben: Jag kom fram till något liknande, tyvärr så tar "NOT IN"-subqueryn alldeles för lång tid. |
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Medlem
|
prova DISTINCT?
|
||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Flitig postare
|
TROR jag har det.
Med en UNION ALL på båda tabellerna och en koll av hur många gånger en rad förekommer (2 gånger så finns raden i båda tabellerna, 1 gång så finns den bara i tabell1). Kod:
SELECT count(*) as count, temp.* FROM ( (SELECT DISTINCT id, value FROM table1 WHERE id IN (SELECT id FROM table2) ) UNION ALL (SELECT DISTINCT id, value FROM table2 LEFT JOIN table1 ON table2.id = table1.id WHERE table1.value = table2.value) ) as temp GROUP BY temp.id, temp.value HAVING count = 1 Frågan är hur snabb denna fråga är när mängden data växer. Hur är prestandat på "UNION ALL" rent generellt, bevaras eventuella index? |
||
![]() |
![]() |
Svara |
|
|