Gå til innhold

[Løst]Liste som tabell i spørring


Anbefalte innlegg

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 av ThaKladd
Lenke til kommentar
Videoannonse
Annonse

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
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 av siDDIs
Lenke til kommentar

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

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 av siDDIs
Lenke til kommentar

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

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 av ThaKladd
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...