Avatar billede Slettet bruger
15. marts 2005 - 14:13 Der er 55 kommentarer og
2 løsninger

Finde alt fra en tabel der ikke er i anden tabel

Lidt underlig titel, men kunne ikke lige komme på noget bedre :o)

Jeg har 2 tabeller:

brugere

ting

for at finde min bruger (jeg er logget ind) der har købt noget siger jeg:

"
SELECT
  brugere.id
FROM
  brugere
  INNER JOIN ting ON ting.brugerid = brugere.id
WHERE
  brugere.id = ". $this->brugerid ."
GROUP BY ting.id
"

Hvilken type join skal jeg bruge, hvis jeg gerne vil have det modsatte.. altså finder alle ting der ikke har mig som ting.brugerid
Avatar billede bromer Nybegynder
15. marts 2005 - 14:15 #1
SELECT
  brugere.id
FROM
  brugere
  INNER JOIN ting ON ting.brugerid <> brugere.id
WHERE
  brugere.id = ". $this->brugerid ."
GROUP BY ting.id

Derudover har det ikke rigtig noget med PHP at gøre. Det var mere passende hvis du havde postet det i MySQL (som jeg antagr du bruger)
Avatar billede coderdk Praktikant
15. marts 2005 - 14:15 #2
Prøv med:

"
SELECT
  brugere.id
FROM
  brugere
  LEFT JOIN ting ON ting.brugerid = brugere.id
WHERE
  ting.brugerid IS NULL
GROUP BY ting.id
"
Avatar billede bromer Nybegynder
15. marts 2005 - 14:17 #3
hehe.. jeg ser at jeg har stenet meget.. sætte min ændring ind det forkerte sted :)
Avatar billede bromer Nybegynder
15. marts 2005 - 14:17 #4
SELECT
  brugere.id
FROM
  brugere
  INNER JOIN ting ON ting.brugerid = brugere.id
WHERE
  brugere.id <> ". $this->brugerid ."
GROUP BY ting.id
Avatar billede barklund Nybegynder
15. marts 2005 - 14:18 #5
Altså, hvis du bare ud fra et id, skal finde alle ting du har købt henholdsvis ikke købt, er der ingen grund til at joine det sammen med bruger-tabellen:

SELECT id FROM ting WHERE brugerid = id
SELECT id FROM ting WHERE brugerid != id

Men hvis det er mere generelt, så tror jeg det er coderdk's version, du er ude efter.
Avatar billede bromer Nybegynder
15. marts 2005 - 14:19 #6
coderdk: Du laver en advanceret SELECT NULL ting der. Du vælger det som der bliver lavet et inner join over som du så kræver skal være NULL
Avatar billede Slettet bruger
15. marts 2005 - 14:20 #7
ok jeg har forklaret det dårligt :'(

Jeg har faktisk 3 tabeller

brugere
ting
brugere_ting

hvor der i brugere_ting er 2 kolonner:
brugere og ting :)
Avatar billede bromer Nybegynder
15. marts 2005 - 14:20 #8
aha.. det var et LEFT.. ikke et INNER
Avatar billede coderdk Praktikant
15. marts 2005 - 14:20 #9
Mja, jeg læste lige igen, og barklund har lige skrevet det jeg ville have skrevet ;)
Avatar billede Slettet bruger
15. marts 2005 - 14:20 #10
så jeg skal egentlig ikke bruge tabellen "brugere" til noget
Avatar billede Slettet bruger
15. marts 2005 - 14:21 #11
bare sig til hvis jeg skal uddybe det lidt mere, jeg tror jeg har forvirret alle nu
Avatar billede bromer Nybegynder
15. marts 2005 - 14:22 #12
Nejnej.. barklund og coderdk er ikke.. men jeg har påtaget mig opgaven af være forvirret for alle tre..
Avatar billede Slettet bruger
15. marts 2005 - 14:25 #13
Jeg har et brugerid ($this->brugerid) og 2 tabeller (ting, bruger_ting)

Jeg vil gerne finde alle rækker i (ting) ikke har en række med mit brugerid ($this->brugerid), og et ting.id

Jeg vil gerne have det i én query, ellers kan det nemt laves sådan:

$q = mysql_query”SELECT * FROM brugere_ting WHERE bruger.id=”. $this->brugerid;
$n = mysql_num_rows($q);

$q2 = mysql_query(“SELECT * FROM ting”);
$n2 = mysql_num_rows($q2);

$detjegvilhave = $n2-$n1
Avatar billede Slettet bruger
15. marts 2005 - 14:27 #14
det skal lige siges, at en bruger ikke kan have flere ens ting.. dvs at ingen rækker har samme brugerid og samme tingid
Avatar billede coderdk Praktikant
15. marts 2005 - 14:29 #15
Prøv:

SELECT
  t.*
FROM
  ting AS t
LEFT JOIN brugere_ting AS bt ON
  t.brugerid = bt.id
WHERE
  bt.brugerid IS NULL
GROUP BY t.id
Avatar billede barklund Nybegynder
15. marts 2005 - 14:30 #16
Hm, så må det være:

SELECT
  t2.id
FROM
  ting AS t2 LEFT JOIN
  (bruger_ting AS bt
    INNER JOIN ting AS t1 ON t1.id = bt.id AND bt.brugerid=1)
  ON t2.id = t1.id
WHERE
  t2.id IS NULL

Så nasty tror jeg faktisk, man er ude i - eller tager jeg fejl?

--
Morten Barklund
Avatar billede Slettet bruger
15. marts 2005 - 14:31 #17
Der er ikke en ting.brugerid..
Avatar billede coderdk Praktikant
15. marts 2005 - 14:33 #18
Ok, nu er jeg ikke helt med. Vil du have alle ting som du ikke har?
Altså alle rækker fra ting som ikke har en binding med brugere_ting med dit brugerid?
Avatar billede Slettet bruger
15. marts 2005 - 14:35 #19
den siger rimelig meget fejl ved din join.

vil i ikke lade være med at kalde tabellerne noget andet plz, jeg bliver virkelig forvirret :)
Avatar billede Slettet bruger
15. marts 2005 - 14:35 #20
præcis coderdk
Avatar billede coderdk Praktikant
15. marts 2005 - 14:36 #21
Prøv lige med:

"
SELECT
  t.*
FROM
  ting AS t
LEFT JOIN brugere_ting AS bt ON
  t.id = bt.tingid
  AND ( bt.brugerid IS NULL
  OR bt.brugerid <> " . $this->brugerid . ")"
Avatar billede Slettet bruger
15. marts 2005 - 14:43 #22
Nu finder den alle rækker undtagen dem hvor jeg er i :)

men den laver ikke et rigtigt join mere.. den udskriver alle rækker fra brugere_ting hvor brugeren er en anden end mig..
Avatar billede barklund Nybegynder
15. marts 2005 - 14:47 #23
smid en group by t.id på også :)
Avatar billede Slettet bruger
15. marts 2005 - 14:47 #24
virker ikke. de andre brugere har jo også de ting jeg har.. derfor kommer de med
Avatar billede coderdk Praktikant
15. marts 2005 - 14:50 #25
"Nu finder den alle rækker undtagen dem hvor jeg er i :)"

Var det ikke det der var meningen?
Avatar billede Slettet bruger
15. marts 2005 - 14:52 #26
jo det var det..

jeg prøvede at gøre det generelt, men jeg forklarer lige min situation så :)

mine tabeller:

cykler, c_f (står for: cykler_forhandler)

og så siger jeg:


SELECT
                cykler.id as id,
                c_f.pris as pris
            FROM
                cykler
                LEFT JOIN c_f ON cykler.id=c_f.cykelid AND (c_f.forhandlerid IS NULL OR c_f.forhandlerid != ". $_SESSION['brugerid'].")"

Hvilket giver mig f.eks. 3 rækker med ting.id 26 (fordi 3 andre forhandlere har denne cykel)
Avatar billede barklund Nybegynder
15. marts 2005 - 14:54 #27
Men hvad ville du da forvente, at c_f.pris skulle give? Hvilken forhandler skulle have prisen for cyklen - han har den jo ikke selv?
Avatar billede coderdk Praktikant
15. marts 2005 - 14:54 #28
Lav:

SELECT

om til:

SELECT DISTINCTROW
Avatar billede coderdk Praktikant
15. marts 2005 - 14:55 #29
Selv min sidste vil give tre forskellige hvis ID 26 har tre forskellige priser!
Avatar billede Slettet bruger
15. marts 2005 - 14:55 #30
-> barklund:

hver forhandler har jo forskellige pris, derfor er prisen der... :)
Avatar billede Slettet bruger
15. marts 2005 - 14:56 #31
jep, det gør den også.. og det er naturligvis cykel.id jeg mener når jeg siger id
Avatar billede coderdk Praktikant
15. marts 2005 - 14:56 #32
Den gør jo det rigtige. Der er tre forskellige, da der er tre forskellige priser på det samme...
Avatar billede Slettet bruger
15. marts 2005 - 14:57 #33
jep.. men det er fordi at denne forhandler er logget ind, så skal han kunne vælge de cykler han _ikke_ selv har.. pris er egentlig ligegyldig i dette tilfælde. det skal ikke vises
Avatar billede Slettet bruger
15. marts 2005 - 14:58 #34
SELECT DISTINCTROW
                cykler.id as id
            FROM
                cykler
                LEFT JOIN c_f ON cykler.id=c_f.cykelid AND (c_f.forhandlerid IS NULL OR c_f.forhandlerid != ". $_SESSION['brugerid'].")"

er egentlig mest rigtig så
Avatar billede barklund Nybegynder
15. marts 2005 - 14:59 #35
Så lad være med at hive pris ud - det forvirrer kun da den netop ikke findes - altså en pris for denne forhandlers version af denne cykel. Du kan få nogle andre forhandleres priser, men det vil du jo ikke have.

SELECT DISTINCT
                cykler.id as id
            FROM
                cykler
                LEFT JOIN c_f ON cykler.id=c_f.cykelid AND (c_f.forhandlerid IS NULL OR c_f.forhandlerid != ". $_SESSION['brugerid'].")"

Og så burde det virke.

--
Morten Barklund
Avatar billede Slettet bruger
15. marts 2005 - 14:59 #36
(hvis der kun kom en række pr. cykel jeg ikke har)
Avatar billede Slettet bruger
15. marts 2005 - 15:02 #37
Nu viser den alle cyklerne med 1 række pr. cykel, sidste række er tom
Avatar billede barklund Nybegynder
15. marts 2005 - 15:03 #38
Og du er sikker på, at du ikke har en tom række i dine tabeller?
Avatar billede Slettet bruger
15. marts 2005 - 15:04 #39
Kan det ikke lade sig gøre i én query?
Avatar billede Slettet bruger
15. marts 2005 - 15:05 #40
Jep, ingen tomme rækker.  og den kommer med 1 række pr. cykel.. også dem jeg har !
Avatar billede barklund Nybegynder
15. marts 2005 - 15:07 #41
Som sagt, så er du vist nødt til at joine med dig selv:

"
SELECT DISTINCT
    c2.id
FROM
    cykler AS c2 LEFT JOIN
    (cykler AS c1 INNER JOIN c_f ON c1.id = c_f.cykelid AND c_f.forhandlerid != ". $_SESSION['brugerid'].")
      ON c2.id = c1.id
WHERE c1.id IS NULL
"

Det er i hvert fald et fjollet bud - om ikke andet :)

--
Morten Barklund
Avatar billede Slettet bruger
15. marts 2005 - 15:11 #42
Der får jeg ikke noget resultat.. eller i hvert fald 0 rækker ^^
Avatar billede barklund Nybegynder
15. marts 2005 - 15:13 #43
Hovsa, det var jo også omvendt:

"
SELECT DISTINCT
    c2.id
FROM
    cykler AS c2 LEFT JOIN
    (cykler AS c1 INNER JOIN c_f ON c1.id = c_f.cykelid AND c_f.forhandlerid = ". $_SESSION['brugerid'].")
      ON c2.id = c1.id
WHERE c1.id IS NULL
"

Tror jeg nok :/
Avatar billede Slettet bruger
15. marts 2005 - 15:14 #44
Med samme resultat :( 0 rækker
Avatar billede Slettet bruger
15. marts 2005 - 15:17 #45
Vil du ikke lige sige til før du giver op?, hvis det lykkedes ligger der naturligvis flere point i det :o)
Avatar billede Slettet bruger
15. marts 2005 - 15:20 #46
100 point til den / dem der opdager hemligheden bag dette :)
Avatar billede barklund Nybegynder
15. marts 2005 - 15:22 #47
Jeg lurer lige på det ved lejlighed - det er lidt nemmere, hvis jeg lige laver mig nogle tabeller at teste den på :)
Avatar billede Slettet bruger
15. marts 2005 - 15:25 #48
okay. det gør du bare så :), under alle omstændigheder vil jeg gerne have svar tilbage.
Avatar billede barklund Nybegynder
15. marts 2005 - 15:29 #49
Hm, prøv lige med:

"
SELECT DISTINCT
    cykler.id
FROM
    cykler
        LEFT JOIN
    c_f
        ON cykler.id = c_f.cykelid
        AND c_f.forhandlerid != ". $_SESSION['brugerid'].")
WHERE
    c_f.forhandlerid IS NULL
"
Avatar billede Slettet bruger
15. marts 2005 - 16:08 #50
Der får jeg kun 1 tom rækker (jeg har lige slettet ")" efter $_SESSION['brugerid'])
Avatar billede Slettet bruger
15. marts 2005 - 16:19 #51
den række der bliver vist er den sidste række i tabellen "cykler"
Avatar billede barklund Nybegynder
15. marts 2005 - 16:26 #52
Hm, jeg kan sgu ikke rigtig få det til at spille ordentligt uden en subselect - prøv at spørge i mysql-kategorien - måske nogen kan finde en løsning.
Avatar billede Slettet bruger
15. marts 2005 - 16:32 #53
oki, smid svar så får du for forsøget. (jeg tager lige den halfe)

ville også gerne give dig coderdk, men 7,5 point gør vidst ikke nogen forskel for nogen :), ellers kan du bare lige slappe mig lidt :o)
Avatar billede barklund Nybegynder
15. marts 2005 - 16:40 #54
Hehe, helt fint. Og at lave det i 2 queries er ikke nødvendigvis skidt :)
Avatar billede Slettet bruger
15. marts 2005 - 17:53 #55
svar tak barklund :o)
Avatar billede barklund Nybegynder
15. marts 2005 - 18:19 #56
Prøver lige igen :)
Avatar billede Slettet bruger
15. marts 2005 - 18:26 #57
yep :)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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