Avatar billede moejensen Nybegynder
08. februar 2003 - 16:38 Der er 11 kommentarer og
1 løsning

Drøn svær SQL streng - Hjælp

Jeg har et kæmpe problem med en SQL sætning, der bare ikke vil som jeg vil. Sætningen skal vælge et tilfældigt picid fra en tabel picture, hvor følgende er gældende:
picid'et der bliver valgt må ikke optræde i tabellen votes sammen med et sessionid der er lig med det pågældende sessionsid (altså sessionid != '" & SessionID & "')
Der ud over skal det gælde at det picid der bliver valgt skal have gender lig med variablen strGender i tabellen persons

Jeg fik for nogle uger siden følgende sql sætning her på eksperten, som desværre ikke virkede

SELECT picture.picid FROM picture LEFT JOIN votes ON picture.picid != votes.picid WHERE sessionid ="& sessionid &" ORDER BY RAND() LIMIT 0, 1;

Problemet med den er det jeg prøver at forklare herunder:

Hvis du forestiller dig at picture og vote indeholder følgende:

picture:

picid,pid,filename,ip,datetime
3, 1, IMG_3057.jpg, 127.0.0.1, 2003-01-28 14:30:55
6, 1, IMG_3062.jpg, 127.0.0.1, 2003-01-28 15:07:19
5, 1, IMG_3807.jpg, 127.0.0.1, 2003-01-28 14:32:03
7, 1, IMG_3058.jpg, 127.0.0.1, 2003-01-28 15:07:28

votes:

id,sessionid, picid, ip, vote, datetime
11, 884168892, 5, 127.0.0.1, 5, 2003-01-28 17:24:15
2, 581581830, 3, 127.0.0.1, 7, 2003-01-28 15:03:40
3, 884168884, 7, 127.0.0.1, 9, 2003-01-28 15:52:23
10, 884168892, 3, 127.0.0.1, 6, 2003-01-28 17:13:34
9, 884168890, 3, 127.0.0.1, 8, 2003-01-28 17:11:26
6, 884168888, 3, 127.0.0.1, 7, 2003-01-28 17:01:09
7, 884168888, 7, 127.0.0.1, 9, 2003-01-28 17:01:17
8, 884168888, 5, 127.0.0.1, 5, 2003-01-28 17:01:22

Hvis jeg kører førnævnte sql sætning og fjerner limit og sætter sessionid = 884168892, får jeg følgende resultat:

picid
7
3
5
6
6
7

Som du kan se, piller den kun de to records ud hvor sessionid er lig 884168892, men planen var at den skulle pille alle forekomster af picid ud, hvor picid er det samme som der hvor sessionid = 884168892 ud, så resultatet kun var:

picid
7
6
6
7

og så skulle den desuden også gerne kun tage en af hver slags, så det idelle resultat er:

picid
6
7

Håber det giver mening :-)
Avatar billede moejensen Nybegynder
09. februar 2003 - 10:36 #1
Er der slet ingen der har et bud?
Avatar billede tbdk Nybegynder
09. februar 2003 - 11:03 #2
Bare rolig, her er den korrekte sætning:

SELECT picid FROM pictures WHERE NOT picid IN (SELECT picid FROM votes WHERE sessionid=884168892)

Jeg har ikke taget RAND med i linien, men mon ikke selv du kan klare det.
Avatar billede moejensen Nybegynder
09. februar 2003 - 12:35 #3
ups min fejl, jeg glemte at sige at jeg bruger version 4 af mySQL, og den understøtter ikke subselections.

Men din løsning er sikkert rigtig, men jeg kan bare ikke bruge den...snøft :-(
Avatar billede tbdk Nybegynder
09. februar 2003 - 13:40 #4
Kan du så ikke bruge en nyere version af mySQL. Måske jeg spørger dumt, men jeg plejer at bruge Access MDB filer.
Avatar billede moejensen Nybegynder
09. februar 2003 - 14:01 #5
problemet er at det er en større side jeg er igang med, og det tvivler jeg på access kan klare i længden. Desuden er det sjælden man finder et webhotel der bruger en alpha version af mySQL, når der findes en der er stabil der hedder version 3.23. Så desværre skal jeg bruge sætningen uden den indeholder subselections :-(
Avatar billede e.oersted Nybegynder
09. februar 2003 - 17:25 #6
Prøv at "vende" din outer join om:

SELECT v1.picid, p1.picid, v1.sessionid
FROM votes as v1
right join pictures as p1
ON v1.picid = p1.picid AND v1.sessionid = "& sessionid &"
where v1.picid is null
Avatar billede e.oersted Nybegynder
09. februar 2003 - 17:29 #7
- Jeg undskylder lige stavefejlen mht tabel-navnet PICTURE ovenfor.
Jeg har desuden ikke medtaget ORDER BY RAND() og LIMIT, men det burde være let at tilføje. Ved test hos mig selv returnerede den i hvert picid 6 & 7
Avatar billede e.oersted Nybegynder
09. februar 2003 - 17:37 #8
Her skulle den være komplet, uden fejl:-)
SELECT v1.picid, p1.picid, v1.sessionid
FROM votes
as v1
RIGHT JOIN picture AS p1
  ON v1.picid = p1.picid
  AND v1.sessionid = "& sessionid &"
WHERE v1.picid IS NULL
ORDER BY RAND( )
LIMIT 0, 1
Avatar billede moejensen Nybegynder
09. februar 2003 - 17:52 #9
Du har fuldt ud fortjent pointne, den virker perfekt efter hensigten. Du skulle bare vide hvor meget tid jeg havde brugt på at finde en løsning på den.

Så Tusind mange tak for den.

Der er dog en tin jeg lidt vil spørge dig om til slut og det er, hvis jeg nu vil have sat endnu et kriterie på som siger følgende:

for det picid der bliver udvalgt, skal det samtidig gælde at det skal være lig med picid i en tabel der hedder persons, hvor gender er lig med "& gender &"

Håber du vil ´hjælpe mig med at få det sidste på, selvom der ikke er ekstra point i det.
Avatar billede moejensen Nybegynder
09. februar 2003 - 18:00 #10
ups jeg glemte lige at fortælle dig, at de felter der binder persons og picture sammen hedder persons.id og picture.pid
Avatar billede e.oersted Nybegynder
09. februar 2003 - 18:04 #11
Jeg vil gerne hjælpe med den sidste join, men er lige nu på vej i biografen - Hvis ikke du selv løser det, eller andre træder hjælpende til, så skal jeg gerne kigge på det lidt senere.

Det skulle dog være muligt at joine PERSONS på p1.pid og persons.id i select-delen og udvide WHERE-clausen med persons.gender = "& gender &", men det må komme an på en prøve.
Avatar billede moejensen Nybegynder
09. februar 2003 - 18:42 #12
det var nok det du skrev her til sidst, så nu virker det perfekt som det skal :-)

Endnu engang tusind tak for hjælpen.

Håber du havde en god tur i buffen
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