03. november 2004 - 14:31Der 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.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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?
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 ?
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
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!? :)
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).
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);
$findbillede_sql = mysql_query("SELECT * FROM hotornot LEFT JOIN hotornot_stemmer ON hotornot.unikid != hotornot_stemmer.unikid WHERE (hotornot.godkendt = '2')");
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!
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? :)
Synes godt om
Ny brugerNybegynder
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.