Avatar billede stieper Nybegynder
26. oktober 2005 - 18:48 Der er 17 kommentarer og
1 løsning

Liste alle personer i Mysql tabel sammen med random picture

Hejsa.

Jeg har en database med 2 tabeller.
1 tabel med users
1 tabel med filer

Alle personerne i "users" har unikt "userid".

De forskellige personer har flere billeder liggende i "filer"-tabellen. I "filer" er der også et "userid" felt, så jeg kan se hvilke billeder der hører til hvem.

Er det muligt at lave en liste med alle de personer der findes i "users" og så kæde et billede (tilfældigt valgt) til den enkelte person i udskriften..

eks.

Bruger1's navn her  |  Tilfældigt billede fra bruger 1 her.
Bruger2's navn her  |  Tilfældigt billede fra bruger 2 her.
osv.

På forhånd tak for hjælpen.
Stieper.
Avatar billede mahler Nybegynder
26. oktober 2005 - 18:53 #1
Prøv noget i stil med:

SELECT DISTINCT u.id, u.name, filer.image FROM users u, filer f
WHERE u.id = f.userid
ORDER BY RAND();

(jeg ved ikke lige om man kan gøre sådan, men det burde man, når min "terning" virker: http://netfactory.dk/technology/database/mysql_random.php)
Avatar billede stieper Nybegynder
26. oktober 2005 - 18:56 #2
Vil brugerne så ikke også blive listet i random order?
De skal helst listes i alfabetisk orden om muligt, og så med et tilfældigt af deres billeder.
Avatar billede stieper Nybegynder
26. oktober 2005 - 19:00 #3
skal nok for god ordens skyld sige at mine billeder ikke ligger som blob i databasen, men har et 'bill_sti' felt med stien til billedet, samt et 'name' felt med filens navn. Disse skal jo også bruges.
Avatar billede mahler Nybegynder
26. oktober 2005 - 19:04 #4
Det gør de sandsynligvis.

Umiddelbart tror jeg, at du er nød til at lave 2 queries, hvis du både vil styre rækkefølgen af personer og vil have et tilfældigt billede...

Så skal du jo bare lave en
SELECT bill_sti, name FROM filer WHERE userid=\"$userid\" ORDER BY RAND() LIMIT 1;
for hver bruger.
Avatar billede stieper Nybegynder
26. oktober 2005 - 19:07 #5
Ok - den er jeg med på, men hvordan undgår jeg at skulle lave en queri for hver bruger så - skal jeg så lave "$userid" til et array af de userid's der findes i "users"?
Avatar billede stieper Nybegynder
26. oktober 2005 - 19:19 #6
$sql1 = "SELECT ID, userfirst, userlast FROM user";
$result1 = mysql_query($sql1) or die(mysql_error());
$number1 = mysql_num_rows($result1);

$sql2 = "SELECT bill_sti, name FROM filer WHERE userid=\"$userid\" ORDER BY RAND() LIMIT 1";
$result2 = mysql_query($sql2) or die(mysql_error());

Her ved jeg at $number1 er de antal brugere jeg skal liste. Dvs jeg skal have en tabel med "$number1" rækker.
Første kolonne i tabellen er simpel nok - det er jo bare en
while ( $row = mysql_fetch_array($result1) ) {
osv..

Men problemet er jo at jeg skal have kædet et billede på hver som skal vises i kolonne nr. 2.
Avatar billede mahler Nybegynder
26. oktober 2005 - 19:55 #7
Hvorfor vil du ikke lave en query pr bruger?

Hvis du laver et index i stil med:
ALTER TABLE filer ADD INDEX ix_billede (userid, bill_sti, name);
så burde din query pr bruger blive meget billig...

Hvis du vil have alle billeder du skal bruge i et hug, skal du sikkert:

SELECT DISTINCT userid, bill_sti, name
FROM filer ORDER BY RAND();

Hvis du tager alle rækker den finder, og laver et array, hvor userid er nøglen (index), så burde du få en tabel, hvor du kan slå alle billeder op.

Du vil dog bruge en masse RAM på det - specielt hvis du har mange brugere, og så vil det andet (en query pr bruger) måske blive hurtigere og enklere...
Avatar billede stieper Nybegynder
26. oktober 2005 - 19:57 #8
Ok - det kan jeg godt se.
Hvordan laver jeg så en query pr. bruger - der kommer jo hele tiden nye brugere til ;-)
Avatar billede mahler Nybegynder
26. oktober 2005 - 20:04 #9
noget i stil med:
---------------
$sql1 = "SELECT ID, userfirst, userlast FROM user";
$result1 = mysql_query($sql1) or die(mysql_error());
$number1 = mysql_num_rows($result1);
while ( $row = mysql_fetch_array($result1) ) {
  $sql2 = "SELECT bill_sti, name FROM filer WHERE userid=\"". $row[id] ."\" ORDER BY RAND() LIMIT 1";
  $result2 = mysql_query($sql2) or die(mysql_error());
  $row2 = mysql_fetch_array($result2);

  // skriv "bruger data" fra $row ud
  // skriv "billed data" fra $row 2 ud
}
Avatar billede stieper Nybegynder
26. oktober 2005 - 20:20 #10
Den vil ikke rigtig fange noget indhold :-/

Hvis jeg skriver

WHERE userid = 101 ORDER BY RAND() LIMIT 1";

Så finder den ud af det - men den vil ikke trække [ID] variablen fra $row..
Avatar billede stieper Nybegynder
26. oktober 2005 - 20:23 #11
ID  mediumint(8) auto_increment

Sådan ser mit ID felt ud i user...
Avatar billede mahler Nybegynder
26. oktober 2005 - 20:25 #12
mon ikke det så måske er $row{'id'] du skal bruge?

Prøv at skrive $row['id'] ud på skærmen, så du kan se om du har adresseret den rigtigt, og se at du får den rigtige værdi ud, som du burde...
Avatar billede stieper Nybegynder
26. oktober 2005 - 20:29 #13
Se det er der problemet ligger ;-) Den får nemlig ingen værdi..

Jeg har godt nok testet det ved at skrive et $number2 ud, hvilken får værdien 0 i alle gennemløb, når jeg skriver userid=\"". $row[id] ."\" eller userid=\"". $row['id'] ."\"

Men den får korrekt værdien 1 i alle gennemløb, når jeg sætter userid=101 , da user 101 har nogle billeder liggende ;-)
Avatar billede mahler Nybegynder
26. oktober 2005 - 20:32 #14
Hvad giver

echo $row['ID'];

inde i dit while loop?
Avatar billede stieper Nybegynder
26. oktober 2005 - 20:41 #15
aabn_forbindelse_og_vaelgdb();
$sql1 = "SELECT ID, userfirst, userlast FROM user";
$result1 = mysql_query($sql1) or die(mysql_error());
$number1 = mysql_num_rows($result1);
luk_forbindelse();

...

while ( $row = mysql_fetch_array($result1) ) {
aabn_forbindelse_og_vaelgdb();
$sql2 = "SELECT bill_sti, name, userid FROM filer WHERE userid=\"". $row['ID'] ."\" ORDER BY RAND() LIMIT 1";
$result2 = mysql_query($sql2) or die(mysql_error());
$number2 = mysql_num_rows($result2);
$row2 = mysql_fetch_array($result2);
luk_forbindelse();

echo $row['userfirst']." ".$row['userlast']." ".$row['ID'] ;  <-- Disse er korrekte og vises korrekt!

echo $row2['userid'] <-- denne vises ikke (får ingen værdi).

}
Avatar billede stieper Nybegynder
26. oktober 2005 - 20:47 #16
Jeg fandt ud af det... det var fordi min 'userid' i filer stod til at være varchar(10) og ikke mediumint(8)... så nu finder den det korrekt ser det ud til.. vidste ikke at den ikke kan søge på det, når det er varchar?
Avatar billede stieper Nybegynder
26. oktober 2005 - 20:47 #17
Smid endelig svar - du har mere end fortjent points!! 1000 tak for hjælpen.
Avatar billede stieper Nybegynder
26. oktober 2005 - 20:47 #18
Nå ja.. du har jo smidt svar.. hehe.. det accepterer jeg!
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