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?
Skal virksomheder stå stærkere mod angreb og kunne udvikle sig, skal sikkerhed, drift og forretning tænkes sammen. Det er tanken bag Jysk IT’s ambition om at skabe en “sikker fremtid” for kunderne.
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.