Kom ihåg mig?
Home Menu

Menu


MySQL-fråga

 
Ämnesverktyg Visningsalternativ
Oläst 2009-05-19, 09:02 #1
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
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?
andi är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-05-19, 10:01 #2
allstars allstars är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Apr 2006
Inlägg: 2 126
allstars allstars är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Apr 2006
Inlägg: 2 126
SELECT * FROM Tabell1 t1 WHERE t1.ID IN (
SELECT t2.ID FROM Tabell2 t2 WHERE NOT t1.`value` = t2.`value`
)

Kanske?!
allstars är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-05-19, 10:45 #3
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
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"?
andi är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-05-19, 12:43 #4
chrizzs avatar
chrizz chrizz är inte uppkopplad
Medlem
 
Reg.datum: Aug 2004
Inlägg: 296
chrizz chrizz är inte uppkopplad
Medlem
chrizzs avatar
 
Reg.datum: Aug 2004
Inlägg: 296
Kod:
SELECT * FROM tabell1 where ID IN (SELECT ID FROM tabell2) AND Value NOT IN (SELECT Value FROM tabell2)
Är det för enkelt? Ger inte det önskad effekt?
chrizz är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-05-19, 13:37 #5
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
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...
andi är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-05-19, 14:06 #6
Perben Perben är inte uppkopplad
Flitig postare
 
Reg.datum: Apr 2009
Inlägg: 393
Perben Perben är inte uppkopplad
Flitig postare
 
Reg.datum: Apr 2009
Inlägg: 393
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);
Perben är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-05-19, 14:14 #7
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Ä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
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-05-19, 14:38 #8
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
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.
andi är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-05-19, 15:10 #9
webbaccess webbaccess är inte uppkopplad
Medlem
 
Reg.datum: Apr 2006
Inlägg: 90
webbaccess webbaccess är inte uppkopplad
Medlem
 
Reg.datum: Apr 2006
Inlägg: 90
prova DISTINCT?
webbaccess är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-05-19, 15:55 #10
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
andi andi är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 344
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
I frågan efter "UNION ALL" så gör jag en JOIN med tabell1 eftersom tabell2 ibland kan innehålla rader som inte tabell1 innehåller, då ska dessa rader i tabell2 inte tas med, för då kommer dessa rader ge "count=1" fast de inte ska vara med i resultatet.

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?
andi är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 10:25.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017