Avatar billede fcknet Nybegynder
04. juli 2004 - 00:58 Der er 14 kommentarer

Subselects i MySQL

Jeg har en tabel over hot or not billeder (hotornot):

id - auto_increment, primary
owner - brugerens id

derudover har jeg en tabel over stemmer (hotornot_votes):

picid = id på billedet
user = brugeren

jeg skal nu udtrække et tilfældigt post hvor brugeren ikke har stemt, dvs. hvor der ikke er et post i tabellen hvor picid = billedets id og userid = $_SESSION[userid]...

Indtil videre er jeg kommet frem til følgende:
SELECT hotornot.*, hotornot_votes.* from hotornot, hotornot_votes where hotornot_votes.owner != '$_SESSION[userid]' AND hotornot_votes.picid = hotornot.id order by RAND() limit 1

Det returnerer ikke noget, selvom jeg har indsat et billede i databasen. Der er ingen poster i tabellen over stemmer.
Avatar billede erikjacobsen Ekspert
04. juli 2004 - 08:45 #1
Prøv

SELECT hotornot.*, hotornot_votes.* from hotornot left join hotornot_votes where hotornot_votes.owner != '$_SESSION[userid]' AND is null hotornot_votes.picid order by RAND() limit 1
Avatar billede erikjacobsen Ekspert
04. juli 2004 - 08:46 #2
Forkert .... vi prøver igen:

SELECT hotornot.*, hotornot_votes.* from hotornot, hotornot_votes where is null hotornot_votes.user  AND hotornot_votes.picid = hotornot.id order by RAND() limit 1

...men utestet ;)
Avatar billede erikjacobsen Ekspert
04. juli 2004 - 08:47 #3
Arrgh, så glemte jeg den left join

SELECT hotornot.*, hotornot_votes.* from hotornot left join hotornot_votes where is null hotornot_votes.user  AND hotornot_votes.picid = hotornot.id order by RAND() limit 1
Avatar billede erikjacobsen Ekspert
04. juli 2004 - 08:48 #4
Nej, ved du hvad - det kan heller ikke passe. Jeg kan faktisk ikke læse mig til hvad
det er der står i dine tabeller. Kan du ikke give et eksempel?
Avatar billede fcknet Nybegynder
04. juli 2004 - 09:15 #5
hotornot:
id: 1
owner: 1


hotornot_votes:
picid: 1 (hentet fra foroven)
userid: 2 (brugeren som har stemt, $_SESSION[userid])


Det du mente?
Avatar billede fcknet Nybegynder
04. juli 2004 - 09:26 #6
Jeg skal finde et tilfældigt post fra hotpeople hvor der ikke er noget post i hotornot_votes hvor picid=hotornot.id og hvor $_SESSION[userid] = user....
Avatar billede erikjacobsen Ekspert
04. juli 2004 - 09:49 #7
Og du har ret i at du skal ud i subselects, ellers kan man ikke lave sådanne negationer.
Understøtter din MySql subselects? Ellers tager du den bare af 2 omgange.
Avatar billede fcknet Nybegynder
04. juli 2004 - 10:28 #8
Den plejer at understøtte det :)

er bare i tvivl om hvordan jeg skal konstruere select'et.
Avatar billede fcknet Nybegynder
04. juli 2004 - 11:05 #9
Jeg har nu copy/pasted en masse eksempler ind i et query fra http://dev.mysql.com/doc/mysql/en/Subqueries.html

Når jeg gør det - copy/paste uden at ændre i felterne forventede jeg at få en fejl om at feltet eller tabellen ikke eksisterede, men istedet får jeg en syntax error.

Er der noget man skal aktivere før man kan bruge de her queries?
Avatar billede erikjacobsen Ekspert
04. juli 2004 - 11:11 #10
MySQL 4.1 ?
Avatar billede fcknet Nybegynder
04. juli 2004 - 11:27 #11
MySQL 4.0.20a-nt
Avatar billede erikjacobsen Ekspert
04. juli 2004 - 11:30 #12
"Starting with MySQL 4.1, all subquery forms and operations that the SQL standard requires are supported"
Avatar billede fcknet Nybegynder
04. juli 2004 - 11:31 #13
hehe ok ;)

Kan man opdatere din mysql version uden at data går tabt?
Avatar billede erikjacobsen Ekspert
04. juli 2004 - 11:33 #14
Hvis ikke bruger du bare din backup.
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