Avatar billede freesite Nybegynder
18. juli 2007 - 11:27 Der 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
Avatar billede fennec Nybegynder
18. juli 2007 - 11:38 #1
Når du siger "ikke er repræsenteret i tabellen link" betyder det så at personen hverken må være child eller parent??
Avatar billede freesite Nybegynder
18. juli 2007 - 11:46 #2
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
Avatar billede fennec Nybegynder
18. juli 2007 - 11:58 #3
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
Avatar billede freesite Nybegynder
18. juli 2007 - 12:17 #4
Nej ikke helt

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
Avatar billede freesite Nybegynder
18. juli 2007 - 12:31 #5
Den skal finde de child i LINK TABELLEN som ikke har en PARENT hvor kon=0 i PERSON tabellen
Avatar billede freesite Nybegynder
18. juli 2007 - 12:48 #6
Så det skal være noget i retning af

SELECT a.id, a.text, a.kon from ancestor a where id not in(select child from link where parent !=(select kon from person))

eller noget
Avatar billede fennec Nybegynder
18. juli 2007 - 12:55 #7
Prøv med denne så:

SELECT a.id, a.text, a.kon from ancestor a inner join link l on l.child=a.id where  l.parent not in(select id from ancestor where kon=0)
Avatar billede freesite Nybegynder
18. juli 2007 - 13:05 #8
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
Avatar billede freesite Nybegynder
18. juli 2007 - 13:06 #9
At jeg så ikke kan benytte SELECT inde i WHERE
Avatar billede freesite Nybegynder
18. juli 2007 - 13:56 #10
Denne her er meget tæt på

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
Avatar billede freesite Nybegynder
18. juli 2007 - 13:59 #11
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)
Avatar billede fennec Nybegynder
18. juli 2007 - 14:19 #12
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.
Avatar billede freesite Nybegynder
18. juli 2007 - 14:29 #13
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
Avatar billede freesite Nybegynder
18. juli 2007 - 14:38 #14
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.
Avatar billede freesite Nybegynder
18. juli 2007 - 14:43 #15
Her er de id's som det ikke må være

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

Kan man så ikke sige
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

SELECT aaa.id
FROM ancestor aaa
WHERE aaa.id not in(a)

eller noget i den stil ?
Avatar billede fennec Nybegynder
18. juli 2007 - 14:56 #16
Kan du ikke bruge den i en in() ???


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
)
Avatar billede freesite Nybegynder
18. juli 2007 - 15:08 #17
Den brokker sig desværre stadig over select inde i where sætningen
Avatar billede fennec Nybegynder
18. juli 2007 - 15:26 #18
Så kan jeg desværre ikke se hvordan det skal løses, uden at skulle klare det via programmeirng.
Avatar billede freesite Nybegynder
18. juli 2007 - 17:33 #19
Hej fennec

Fik løst problemet, måden er nok lidt kluntet

    SELECT DISTINCT l.child
    FROM link l
    INNER JOIN ancestor a ON a.id=l.parent
    WHERE a.user='$user' and a.kon=0") or die(mysql_error());

Hvor jeg så smider resultatet over i variablen $cons

    SELECT a.id, a.firstname, a.lastname
    FROM ancestor a
    WHERE (a.user='$user' and a.id NOT IN($cons))

Problemet opstår når jeg vil bruge limit da jeg er tvunget til at løbe den første SELECT helt igennem
Avatar billede freesite Nybegynder
18. juli 2007 - 17:36 #20
Men tak for hjælpen, retter det til med den du foreslog når webhotellet får en nyere udgave MYSQL databasen

Kan jeg få dig til at smide et svar
Avatar billede fennec Nybegynder
19. juli 2007 - 08:53 #21
.o) <-- One Eyed Jack
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester