Avatar billede moejensen Nybegynder
26. januar 2003 - 16:28 Der er 14 kommentarer og
1 løsning

¨Problemer med et par sætninger

Jeg har lige et par kompliserede mySQL sætninger, som jeg  gerne vil have lidt hjælp til:

For at det er lidt nemmere at forstå hvad jeg skriver, så vil jeg lige beskrive de tre tabeller der bliver brugt:

Persons: Indeholder følgende felter: id, navn, gender
Picture: Indeholder følgende felter: picid, filename, pid (persons id)
votes: Indeholder følgende felter: picid, sessionid

1)
Den første sætning der volder mig problemer er en sætning, der vælger et tilfældigt picid fra tabellen 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

2)
Anden sætninger omhandler også lidt samme problematiok som ovenfor. Den startede således:

SELECT picture.*,((hits.vote1+hits.vote2+hits.vote3+hits.vote4+hits.vote5+hits.vote6+hits.vote7+hits.vote8+hits.vote9+hits.vote10) / hits.raters) AS score FROM picture INNER JOIN hits ON hits.picid=picture.picid WHERE persons.gender=" & strGender

Men den virker ikke helt, da SQL ikke helt forstår mig når jeg til sidst skriver "WHERE persons.gender=" & strGender" til sidst, da der er tale om en betingelse i en anden tabel.

Hvordan får jeg skrevet betingelsen ind så mySQL fatter det? :-)

Håber det er bare lidt forståligt det jeg skriver :-)
Avatar billede roo104 Nybegynder
26. januar 2003 - 18:40 #1
Ok her kommer et forsøg på 1'eren:
SELECT picid FROM picture WHERE gender = 'strGender' MINUS SELECT picid FROM votes;
Så burde du have de id's som ikke findes i vote og har gender = strGender.
Avatar billede moejensen Nybegynder
26. januar 2003 - 18:43 #2
glemmer du ikke at gender ligger i en hel anden tabel, og at tage højde for sesionid et i vote tabellen?
Avatar billede roo104 Nybegynder
26. januar 2003 - 18:49 #3
Ahh, så der er find først picid i person hvor gender = strGender
SELECT picid FROM picture WHERE pid = (SELECT id FROM persons WHERE gender = 'strGender') MINUS SELECT picid FROM votes;

Så er pid fremmednøgle i picture!
Avatar billede moejensen Nybegynder
26. januar 2003 - 18:51 #4
så mangler du bare at tage højde for at i votes må picid ikke optræde i samme række som sessionid
Avatar billede roo104 Nybegynder
26. januar 2003 - 18:57 #5
SELECT picid FROM picture WHERE pid = (SELECT id FROM persons WHERE gender = 'strGender') MINUS SELECT picid FROM votes WHERE sessionid != 'SessionID;

Håber det her virker !
Avatar billede moejensen Nybegynder
27. januar 2003 - 13:40 #6
det er ved at se rigtigt ud, nu mangler jeg bare at det skal være et tilfældigt id der bliver udvalgt.
Avatar billede moejensen Nybegynder
27. januar 2003 - 13:43 #7
jeg får følgende fejl ved brug af dit sidste forslag:

Error Type:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E09)
[TCX][MyODBC]You have an error in your SQL syntax near 'SELECT picid FROM votes WHERE sessionid != 581581827' at line 1
Avatar billede roo104 Nybegynder
27. januar 2003 - 15:34 #8
Er det ASP du bruger ?

For at finde at tilfældigt id kan man:
SELECT picid FROM picture WHERE pid = (SELECT id FROM persons WHERE gender = 'strGender') LIMIT 0,1 ORDER BY RAND() MINUS SELECT picid FROM votes WHERE sessionid != 'SessionID;

Så burde den vælge kun ét id, som er tilfældigt.
Avatar billede moejensen Nybegynder
27. januar 2003 - 16:31 #9
yep det er asp jeg bruger, jeg prøver lige strengen i aften når jeg kommer hjem, og vender tilbage.
Avatar billede roo104 Nybegynder
27. januar 2003 - 18:17 #10
SQL = "SELECT picid FROM picture WHERE pid = (SELECT id FROM persons WHERE gender = 'strGender') ORDER BY RAND() LIMIT 0,1 MINUS SELECT picid FROM votes WHERE sessionid != '"&SessionID&"'"

Eller sådan noget
Avatar billede moejensen Nybegynder
27. januar 2003 - 20:25 #11
jeg får stadig denne fejl:

Error Type:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E09)
[TCX][MyODBC]You have an error in your SQL syntax near 'MINUS SELECT picid FROM votes WHERE sessionid != 581581827' at line 1

Jeg har heller aldrig hørt om den syntaks der hedder "MINUS", virker den i mySQL?
Avatar billede roo104 Nybegynder
28. januar 2003 - 07:57 #12
Nej MINUS er vist ikke en del af MySQL, den stod bare i en SQL bog jeg havde.
Jeg ved ikke om man kan bruge "-" tegnet:
http://www.mysql.com/doc/en/Function_Index.html

Ellers må jeg nok sige at jeg ikke ved hvordan det ellers skal være :(
Avatar billede roo104 Nybegynder
28. januar 2003 - 07:59 #13
Hov her er noget, her sætter de 2 søge strenge op mod hinanden, kigger på det lidt senere, er på vej i skole nu:
http://www.mysql.com/doc/en/Fulltext_Search.html
Avatar billede moejensen Nybegynder
28. januar 2003 - 18:48 #14
Jeg fik for nogle dage siden følgende sql sætning her på eksperten, som dog ikke tager højde for strGender:

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

Den virker også fint, der er bare et problem, som jeg ikke kan gennemskue hvordan jeg løser. jeg prøver herunder at forklare det:

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 hvor sessionid = 884168892 ud, så resultatet kun var:

picid
7
6
6
7

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

picid
6
7

Håber det bare gav lidt mening :-)
Avatar billede moejensen Nybegynder
08. februar 2003 - 16:38 #15
jeg lukker spg, da der ikke sker mere her.
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