18. juli 2007 - 11:27Der er
20 kommentarer og 1 løsning
select - join problem
Hej eksperter håber i kan hjælpe mig med en sql sætning
Jeg har to tabeller PERSON TABEL id text køn
LINK TABEL child parent
Tabel link bruges til at lave en relation mellem personer i PERSON tabellen
Vil nu gerne lave et udtræk fra person tabellen, hvor jeg får kun de personer som ikke er repræsenteret i tabellen link og de personer som er repræsenteret i tabellen link men ikke har køn = 0.
Har forsøgt med
$query = mysql_query(" SELECT anc.text, anc.id, anc2.kon, lnk.parent FROM ancestor anc LEFT OUTER JOIN link lnk ON anc.id=lnk.child LEFT OUTHER JOIN ancestor anc2 ON lnk.parent=anc2.id WHERE anc2.kon is null ") or die(mysql_error());
Men her får jeg kun dem ud som ikke er repræsenteret som child i LINK tabellen
Håber der er nogle som har en løsning på problemet
Det er ikke alle person.id som er repræsenteret i LINK tabellen, men dem vil jeg også gerne have ud
Skal nemlig bruges det, når jeg sidder nye personer ind, da link tabellen kun må indeholde en child-parent kombination, hvor der kun er en parent med kon=0 til hver child
Ikke helt sikker på hvad du mener, men det må være en union løsning:
Find alle som ikke er i link: SELECT a.id, a.text, a.kon from ancestor a where id not in(select child from link) and id not in(select parent from link)
Find alle som er i link og har køn=0: SELECT a.id, a.text, a.kon from ancestor a where id in(select child from link) and id in(select parent from link) and a.kon=0
Samlet: SELECT a.id, a.text, a.kon from ancestor a where id not in(select child from link) and id not in(select parent from link) Union SELECT a.id, a.text, a.kon from ancestor a where id in(select child from link) and id in(select parent from link) and a.kon=0
den første er god nok men SELECT a.id, a.text, a.kon from ancestor a where id in(select child from link) and id in(select parent from link) and a.kon=0 skulle være alle som ikke har kon = 0. Da en person kan være repræsenteret 2 gange i LINK tabellen. Men vil kun have den ud hvis der slet ikke findes en repræsentation hvor kon=0
Den giver en 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 id from ancestor where kon=0)' at line 4
Men kan det skyldes at jeg bruger MySQL Database version 4.0.20
SELECT a.firstname, a.lastname, a.kon FROM ancestor a LEFT JOIN link l ON l.child=a.id LEFT JOIN ancestor aa ON aa.id=l.parent WHERE aa.kon!=0
MEN hvis et ancestor id er repræsenteret 2 gange som child i link tabellen, hvor der er en parent med køn=0 og en parent med køn=1 så virker det ikke. Her skulle dem som både har en parent med kon=0 og en parent med kon=1 sorteres fra
Lige en rettelse til ovenstående kode SELECT a.id, a.firstname, a.lastname, a.kon FROM ancestor a LEFT JOIN link l ON l.child=a.id LEFT JOIN ancestor aa ON aa.id=l.parent WHERE a.user='$user' and (aa.kon!=1 or aa.kon is null)
Som jeg kan se det, bliver du nød til at bruge in(select ..), for at det kan løses via SQL. Subselect kom først med i v4 af MySQL, og kun begrænset, så det kan meget vel være det som driller. Er det muligt for dig at opgradere til v5?
Ellers skal du løses i dit program (php). Der kan du selecte alle ancestor, også i den efterfølgende løkke lave endnu et opslag, og tjekke om de har en parent eller ej.
Tror desværre ikke at det er muligt at opgraderer min MYSQL da databasen køre på en server ude i byen.
Og vil helst undgå at bruge php til at løse det, da planen er at der skal tilføjes et limit på resultatet, så det kun tager de første 10 resultater og så kan der bladres frem gennem resultaterne.
Men frygter lidt at du har ret i at det ikke kan lade sig gøre uden
Ellers kan jo sagtens finde de id'er som det ikke må være. Ved ikke om det så kan lade sig gøre at lave en midlertidig tabel som holder dem og så lave opslag hvor hvor jeg siger den skal tage alle fra ancestor tabellen undtagen dem so m findes i den midlertigdige tabel.
SELECT aaa.id FROM ancestor aaa WHERE aaa.id not in( SELECT a.id FROM ancestor a INNER JOIN link l ON l.child=a.id INNER JOIN ancestor aa ON aa.id=l.parent WHERE aa.kon=1 Union SELECT a.id FROM ancestor a INNER JOIN link l ON l.child=a.id INNER JOIN ancestor aa ON aa.id=l.parent WHERE aa.kon=1 )
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.