Avatar billede dugi Nybegynder
03. november 2004 - 14:31 Der er 15 kommentarer og
1 løsning

Kan ikke beskrive mit problem med en overskrift!

Hej alle.

Jeg sidder med et problem, som jeg faktisk har utrolig svært ved at forklare hvad jeg skal bruge hjælp til. Jeg ved godt hvad jeg vil have den til, men jeg ved ikke hvordan jeg skal gøre, og det er utrolig svært at beskrive - så håber i kan forstå mig og hjælpe mig med mit problem.

Jeg er ved at lave et karakter billedafstemnings system. Folk kalder det Hot or Not, men nu ikke lige det meningen med systemet er.

MEN, mit problem er:

Jeg har to tabeller:
hotornot - denne tabel indeholder alle de billeder brugere oploader og som andre brugere skal give karakter.
hotornot_stemmer - denne tabel indeholder alle de stemmer som er givet til de forskellige billeder. Max en stemme pr. billed pr. bruger.

Det jeg skal have lavet er:
Jeg skal have en kode som hiver et billed ud fra hotornot, men som ikke findes i hotornot_stemmer til den indloggede bruger. Og den skal kun vælge et.

Havde tænkt lidt på at lave en while løkke og gennemgå alle billeder i hotornot_stemmer hvor brugeres unikkeid var - altså finde alle de billeder han havde stemt på. Også i den while løkke skulle der vare en SQL string som hev et billed ud som brugeren ikke havde stemt på.
- Men hvis så nu brugeren har stemt på mere end et billede blir løkken jo ved, også udskriver den jo mere en det ene billede som den skal fra hotornot!

Jeg håber i kan forstå mig, og evt. har en løsning - da jeg har siddet og knoklet med det her ret længe og er utrolig meget på bar bund.


På forhånd tusind tak.

Mvh.
Morten Rugaard
Avatar billede drbean Nybegynder
03. november 2004 - 15:32 #1
Det du skal gøre, er at lave en SQL sætning der bruger JOIN. Jeg kan desværre ikke huske den rigtige syntax, men så evt på nette. Bagefter skal du bruge en LIMIT i din sql sætning, og sætte den til 1. (LIMIT 1,1). Igen jeg kan ikke huske den rigtige måde at gøre dette på, og mine bøger ligger der hjemme. Jeg kan evt slå det op for dig på lørdag, men mon ikke der er ændre der kan hjælpe dig herfra?
Avatar billede dugi Nybegynder
03. november 2004 - 16:29 #2
drbean, tak for et hurtigt svar.
Uha, har aldrig prøvet JOIN før - men har lige kigget lidt på det, og har et spørgsmål: Skal det være OUTER eller INNER JOIN ?
Avatar billede jaw Nybegynder
03. november 2004 - 18:49 #3
Jeg er altså ikke helt sikker på at jeg forstår, og er derfor heller ikke sikker på at det her er løsningen, men det er da et forslag :)

SELECT * FROM hotornot
LEFT JOIN hotornot_stemmer ON brugerid != $loginid
LIMIT 1
Avatar billede coderdk Praktikant
03. november 2004 - 21:14 #4
Noget i stil med dette:

SELECT h.*, hs.userid FROM hotornot h LEFT OUTER JOIN hotornot_stemmer hs ON h.hotornotid = hs.hotornotid AND hs.userid = $brugerid WHERE hs.userid IS NULL

Så vidt jeg lige kan se vil de hive alle records ud fra hotornot hvor brugeren med $brugerid ikke har en record i hotornot_stemmer
Avatar billede dugi Nybegynder
03. november 2004 - 21:57 #5
Hmm det hele ser utrolig avanceret ud.
men coderdk du har fat i præcis det du siger til sidst, men mon du kunne være så venlig at forklare din kode, for vil nemlig også rigtig gerne lære det her join noget!? :)
Avatar billede coderdk Praktikant
03. november 2004 - 22:14 #6
Et LEFT OUTER JOIN fungerer som et normalt join, bortset fra at den joiner over ALLE records i den første tabel. De steder hvor der ikke er en record i tabel2 vil tabel2's felter være NULL (hvis du hiver dem ud).

Prøv at læse http://www.1keydata.com/sql/sql.html f.eks. (har ikke kigget meget på den, bare lige set at den også dækker dette).
Avatar billede coderdk Praktikant
03. november 2004 - 22:16 #7
Nah, det var vist mest Oraclecentreret ;P
Måske: http://www.keithjbrown.co.uk/vworks/mysql/
Avatar billede drbean Nybegynder
03. november 2004 - 22:32 #8
coderdk -> den skal vel også hive alle sammen ud, og så sætte man bare en limit til sidst, så få man kun en record
Avatar billede coderdk Praktikant
03. november 2004 - 22:34 #9
drbean, yep! :)
Avatar billede dugi Nybegynder
03. november 2004 - 23:12 #10
tusind tak :)
Jeg prøver det i morgen, læg lige et svar hvis det virker så du kan få dine point!
- Det samme med dig drbean.
Avatar billede coderdk Praktikant
04. november 2004 - 00:00 #11
aight :)
Avatar billede dugi Nybegynder
04. november 2004 - 09:09 #12
coderdk, jeg har ikke brugt din kode.
Jeg læste hele den artikel i gennem som du skrev (http://www.keithjbrown.co.uk/vworks/mysql/), kanon god artikel, som jeg faktisk lærte en hel del af. Men via. den artikel lavede jeg så min egen string. Men du får pointne da du jo gav mig linket :)

Men en ting ang. din string. Hvorfor bruger du OUTER? Der står intet om OUTER JOIN i artiklen, så hvad er det og er det bedre end uden OUTER? :)

Min string blev sådan her:
$findbillede_sql = mysql_query("SELECT * FROM hotornot LEFT JOIN hotornot_stemmer ON hotornot.unikid != hotornot_stemmer.unikid WHERE (hotornot.godkendt = '2')");
    $findbillede = mysql_fetch_array($findbillede_sql);
Avatar billede dugi Nybegynder
04. november 2004 - 09:09 #13
$findbillede_sql = mysql_query("SELECT * FROM hotornot LEFT JOIN hotornot_stemmer ON hotornot.unikid != hotornot_stemmer.unikid WHERE (hotornot.godkendt = '2')");
   
$findbillede = mysql_fetch_array($findbillede_sql);
Avatar billede dugi Nybegynder
04. november 2004 - 09:44 #14
Hov vent, det virker faktisk ikke helt korrekt :O
Avatar billede dugi Nybegynder
04. november 2004 - 09:52 #15
mysql_query("SELECT * FROM hotornot LEFT JOIN hotornot_stemmer ON hotornot.id != hotornot_stemmer.billedid WHERE hotornot.godkendt = '2' AND hotornot_stemmer.unikid = '$_SESSION[unikid]' ORDER BY RAND() LIMIT 1");

Den vælger alle records.
Altså den kan ikke finde ud af at den bruger som er logget ind allerede har stemt på billederne!

Mine tabeller ser således ud:
CREATE TABLE `hotornot` (
  `id` int(255) NOT NULL auto_increment,
  `billed` text NOT NULL,
  `unikid` text NOT NULL,
  `kommentar` text NOT NULL,
  `godkendt` int(1) NOT NULL default '0',
  UNIQUE KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=4 ;

#
# Data dump for tabellen `hotornot`
#

INSERT INTO `hotornot` VALUES (1, '01.jpg', 'indeed', 'Helt nye billed, taget d. 29.10.2004\r\nStem fair ;)', 2);
INSERT INTO `hotornot` VALUES (2, '01.jpg', 'jubii', 'Davs', 2);
INSERT INTO `hotornot` VALUES (3, '01.jpg', 'WUARW', 'OMG ?', 2);


CREATE TABLE `hotornot_stemmer` (
  `id` int(255) NOT NULL auto_increment,
  `billedid` int(255) NOT NULL default '0',
  `unikid` text NOT NULL,
  `stemme` int(2) NOT NULL default '0',
  `dato` text NOT NULL,
  `tid` text NOT NULL,
  UNIQUE KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;

#
# Data dump for tabellen `hotornot_stemmer`
#

INSERT INTO `hotornot_stemmer` VALUES (1, 1, 'BeQieBaBz!', 10, '04.10.2004', '09:06');
INSERT INTO `hotornot_stemmer` VALUES (2, 2, 'BeQieBaBz!', 9, '04.11.2004', '09:31');




Mon en af jer kunne lave den rigtige SQL string? ;(
Nu er jeg ved at give op!
Avatar billede dugi Nybegynder
04. november 2004 - 13:26 #16
coderDK, jeg har brugt din string nu - og den virker korrekt dog bare omvendt:
mysql_query("SELECT * FROM hotornot LEFT OUTER JOIN hotornot_stemmer ON hotornot.id = hotornot_stemmer.billedid AND hotornot_stemmer.unikid != '$_SESSION[unikid]' WHERE hotornot_stemmer.unikid IS NULL order by RAND() LIMIT 1") or die(mysql_error());

Den "filter" billeder når du ikke er logget ind, hvor den skal gøre det NÅR du er logget ind, og den skal filtrerer alt efter hvilken bruger der er logget ind. Kan du redigerer stringen så den gør det? :)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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