ThaKladd Skrevet 10. juli 2009 Del Skrevet 10. juli 2009 (endret) Jeg har en liste med verdier: 204, 205, 206, la oss si de er id'er til en bil Disse kan jeg bruke i en slik sprørring: SELECT DISTINCT user.* FROM user, userhascar, car WHERE userhascar.carid IN(204,205,206) AND userhascar.userid = user.id Men denne sjekker bare hvorvidt en car.id til en bruker er i listen, og returnerer brukerne som har denne bilen inne. Jeg vil hente ut alle brukere som har alle carid i denne mengden, og dermed må jeg bruke JOINS. Men hvordan kan jeg ta i bruk JOINS med en liste som denne? Denne listen er jo ikke en tabell med carid som jeg kan matche mot. edit: bruker mysql Endret 14. juli 2009 av ThaKladd Lenke til kommentar
blackbrrd Skrevet 10. juli 2009 Del Skrevet 10. juli 2009 Sliter litt med å forstå hva du prøver å si, men du kan ha en indre spørring inni IN clausen: ... IN( SELECT id FROM table INNER JOIN table2 WHERE id = x) Lenke til kommentar
ThaKladd Skrevet 13. juli 2009 Forfatter Del Skrevet 13. juli 2009 Litt kronglete, sorry. Kom litt lenger, noe som gjør det lettere å forkalre kjernen i problemet. Tabellen jeg skal matche opp mot er en koblingstabell mellom bruker og bil, dvs: (brukerid, bilid) med verdiene (1,201) (1,202) (2,201) (2,203) (2,205) (3,202) (3,203) (3,205) (4,201) (4,202) (4,205) Det jeg vil finne er for eksempel alle brukerne som har bilene 201 og 205 -> altså bruker 2 og 4 - men hvordan gjør jeg det? Lenke til kommentar
siDDis Skrevet 13. juli 2009 Del Skrevet 13. juli 2009 SELECT A.brukerid FROM user AS A WHERE EXISTS( SELECT 1 FROM userhascar AS B WHERE B.bilid IN (201, 205) AND A.brukerid = B.brukerid ); Lenke til kommentar
ThaKladd Skrevet 13. juli 2009 Forfatter Del Skrevet 13. juli 2009 Det fungerer ikke, for hvis jeg legger til 206 - > som hverken bruker 2 eller 4 har, så dukker likevel de opp som resultat... Siden ingen har bil 206, så skal også svaret være tomt. Lenke til kommentar
blackbrrd Skrevet 13. juli 2009 Del Skrevet 13. juli 2009 (endret) Tror du skal bruke ALL istedetfor IN Endret 13. juli 2009 av blackbrrd Lenke til kommentar
siDDis Skrevet 14. juli 2009 Del Skrevet 14. juli 2009 (endret) Det fungerer ikke, for hvis jeg legger til 206 - > som hverken bruker 2 eller 4 har, så dukker likevel de opp som resultat... Siden ingen har bil 206, så skal også svaret være tomt. SELECT A.id FROM user AS A INNER JOIN userhascar AS C ON A.id = C.brukerid WHERE EXISTS( SELECT 1 FROM userhascar AS B WHERE B.bilid IN (201, 205, 206) AND A.id = B.brukerid) GROUP BY A.id HAVING count(C.bilid) > 3 Endret 14. juli 2009 av siDDIs Lenke til kommentar
blackbrrd Skrevet 14. juli 2009 Del Skrevet 14. juli 2009 Interessant løsning siddis Lenke til kommentar
ThaKladd Skrevet 14. juli 2009 Forfatter Del Skrevet 14. juli 2009 blackbrrd: ALL fungerer ikke på den måten id=ALL(204,205) er det samme som id=204 AND id=205, noe som blir helt feil siden et felt ikke kan være lik to verdier. ALL må ha en =>< foran, som skal fungere på alle parametrene til ALL. siDDIs: Så det er den veien du mener man må gå? Ingen enklere JOIN som fikser biffen? Jeg har nemlig prøvd med flere varianter av noe lignende. Det vil si COUNT, JOIN, IN etc, men de feiler slik som din siste også ser ut til. Fikk du den til å fungere?? (både på 1, 2 og flere bilid, slik at brukeren som returneres har alle bilene med de idne eller flere) Takk for at du gir nye ideer til mulig løsning ihvertfall :-) Lenke til kommentar
siDDis Skrevet 14. juli 2009 Del Skrevet 14. juli 2009 (endret) Om eg skjønner problemstillinga di rett så bør den querien fungere, ergo når du legger til 206 som ingen bruker har så returnerer den ingenting. Det du må er jo å finne ut summen av antall biler du har i IN() og legge dei til count'en på slutten. Endret 14. juli 2009 av siDDIs Lenke til kommentar
ThaKladd Skrevet 14. juli 2009 Forfatter Del Skrevet 14. juli 2009 Det er jeg klar over. Ta å fjern 206 fra IN, altså tilbake til (201,205) og med COUNT > 2, så vil fortsatt bruker 3 dukke opp -> som bare har 205, men ikke 201 Vil jeg ha aller brukerne med bilene (201, 202) med COUNT > 2 så får jeg svar bruker 2,3,4 -> mens bare bruker 4 har disse to av de som dukker opp, mens bruker 1 dukker ikke opp men har de to. Hvorfor? fordi count(C.bilid) = 3 på alle de svarene som dukker opp -> og altså >2 Det mangler noe som teller opp antall treff per bruker, og count må være antallet treff. Er antallet treff lik antallet biler inn -> så skal jo returneres for da har brukeren treff på alle. Lenke til kommentar
blackbrrd Skrevet 14. juli 2009 Del Skrevet 14. juli 2009 I postgresql så kunne du også ha brukt array sammenligning: SELECT ... WHERE ARRAY(SELECT B.bilid FROM userhascar B WHERE A.id = B.brukerid) @> ARRAY[201, 205, 206] Lenke til kommentar
ThaKladd Skrevet 14. juli 2009 Forfatter Del Skrevet 14. juli 2009 hadde bare MySQL hatt en @> :-) Lenke til kommentar
ThaKladd Skrevet 14. juli 2009 Forfatter Del Skrevet 14. juli 2009 (endret) Jeg har en løsning, bare så det er nevnt, men den er tungvin og treg med en subspørring ofr hver bilid -> og siden denne spørringen bare inngår i en enda større spørring som en subspørring så blir den fryktelig treg dess fler biler jeg skal ha med. SELECT DISTINCT brukerid FROM userhascar WHERE brukerid IN (SELECT DISTINCT brukerid FROM userhascar WHERE bilid = 201 AND brukerid IN (SELECT DISTINCT brukerid FROM userhascar WHERE bilid = 202) ) Derfor hadde jeg håpet på en raskere og kortere variant... Endret 14. juli 2009 av ThaKladd Lenke til kommentar
siDDis Skrevet 14. juli 2009 Del Skrevet 14. juli 2009 Det var ein feil der ja, kan sikkert løyast med å lage vanvittige subselects men nå synes eg dette blir ein betre måte å gjere det på: SELECT A.id FROM user AS A WHERE EXISTS( SELECT 1 FROM userhascar AS B WHERE B.bilid = 201 AND A.id = B.brukerid ) AND EXISTS( SELECT 1 FROM userhascar AS B WHERE B.bilid = 205 AND A.id = B.brukerid ) AND EXISTS( SELECT 1 FROM userhascar AS B WHERE B.bilid = 206 AND A.id = B.brukerid ) ; Så får du legge til ein EXISTS for kvar bil. Du burde heller seriøst vurdere databasebytte. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå