Select - Output betinget af ens poster i 2 andre tabeller
Hej.
Jeg har problemer med at få lavet en select, der giver mig data betinget af om posterne i anden tabel også findes i trede tabel. Mine tabeller ser således ud:
t1 ------- ID T3id Data11
t2 ------- T1id A
t3 ------- ID Data31
t4 ------- T3id A
Og relationerne således: t2 -n---1- t1 t1 -n---1- t3 t3 -1---n- t4
Jeg skal bruge dataene fra t1. Men hvis der er findes en eller flere poster i t2 som relaterer til en post i t1, skal disse poster også findes i t4 (t2.a = t4.a), ellers skal posten fra t1 IKKE med i mit resultat. Betingelsen går IKKE den anden vej, dvs. hvis der er findes poster i t4 som relaterer til posten i t1 (via t3), hvor den tilsvarende post ikke findes i t2 skal t1-posten stadig med i mit resultat. Hvis der IKKE findes poster i t2 som relaterere til en post i t1, skal denne også med i resultatet.
Håber I forstår, hvad jeg mener (det blev vist ligeså svært at beskrive som at lave SQL-sætningen ;-)).
Nogen der har et par forslag til hvordan det kan kringles?
Tak for det hurtige svar, men det virker desværre ikke, jeg får følgende fejl:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT * FROM t2 WHERE t2.t1id=t1.id) OR EXIST (SELECT * FROM t1,t3,t4 WHERE t4' at line 2
Jeg bruger MySQL 5, så nested SQL skulle ikke være problemet...
Når jeg kigger på SQL-sætningen, synes jeg heller ikke at jeg kan se at der bliver tjekket for at posterne i t2 også findes i t4?
SELECT * FROM t1 WHERE NOT EXISTS (SELECT * FROM t2 WHERE t2.t1id=t1.id) OR EXISTS (SELECT * FROM t2,t1,t3,t4 WHERE t2.a=t4.a AND t4.t3id=t3.id AND t3.t1id=t1.id)
Nu virker SQL-sætningen, det er bare ikke det ønskede resultat. I resultatet får jeg poster, hvor der ikke er nogen relationer i t2 , og der er OK.
Men jeg får desværre også poster med, bare een af posterne i t2 også findes i t4.
F.eks. har jeg 1 post i t1, som har to relationer fra t2 (en hvor a=100 og en hvor a=110). Til posten i t1 relaterer 3 poster i t4, men i disse 3 poster er a=110, a=120 og a=130). Dvs. at der i t4 mangler en relation hvor a=100, derfor ønsker jeg ikke denne post fra t1 med i resultatet... Kan det fixes?
du kan lave en count på antallet kombineret der skal matche antallet fra t2 som:
SELECT * FROM t1 WHERE NOT EXISTS (SELECT * FROM t2 WHERE t2.t1id=t1.id) OR (SELECT COUNT(1) FROM t2,t3,t4 WHERE t2.a=t4.a AND t4.t3id=t3.id AND t3.t1id=t1.id) = (SELECT COUNT(1) FROM t2 WHERE t2.t1id=t1.id)
Tror jeg måske? :)
Det undrede mig også, at t1 blev brugt i udvælgelse i indre query - så relaterer den jo overhovedet ikke til den udenom?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.