2012-04-01 12 views
5

Stavo cercando un modo per creare un widget di traduzione collaborativa. Quindi ho un database e una tabella mysql (chiamate traduzioni) e un piccolo script per consentire agli utenti di tradurre una pagina alla volta.Stampa una riga casuale da una query mysql

Ma non sono abbastanza convinto con la mia sceneggiatura. Non penso sia abbastanza efficiente. In primo luogo, il mysql ottiene tutte le righe con la colonna 'en' vuota, e poi una sola di esse viene mostrata a schermo per un po '. C'è un altro modo per farlo? Questo è il codice:

//Retrieve all the data from the "translations" table 
$result = mysql_query("SELECT * FROM translations WHERE en IS NULL OR en=''") or die(mysql_error()); 

$Randnum=rand(0,mysql_num_rows($result)-1); //Gets a random number between 0 and the maximum number of rows 
$i=0; //Start to 0 
while($Col = mysql_fetch_array($result)) //While there are rows to evaluate 
    { 
    if ($i==$Randnum) 
     { 
     echo "\"".$Col['es']."\"<br><br>Translate it to English: <br>"; 
     } 
    $i++; 
    } 

ero alla ricerca di qualcosa come "echo $ Col [$ Randnum] [ 'es']" o "echo $ Col. $ Randnum [ 'es']" invece di utilizzare l'intero ciclo while per stampare una singola riga casuale. Come posso implementarlo? Se si tratta solo di ottimizzazione. Se potessi venire con una sceneggiatura o un'idea da assegnare a $ Col solo UNA riga con un numero casuale e il campo vuoto 'en', sarebbe ancora meglio! (Penso che non sia possibile questo ultimo bit). La riga 'en' è testo quindi non so come implementare other methods che ho visto in giro mentre usano il numero con ORDER BY.

risposta

7

È possibile utilizzare ORDER BY RAND() LIMIT 1 nella query per andare a prendere una sola riga casuale dal database.

+0

+1 per essere i primi, anche se è 'RAND()' :) –

+0

Funzionerà anche con il testo? Anche se funzionasse, non selezionerebbe il testo che ha il primo ASCII come rand() ha detto? (ad esempio, se molte righe iniziano con 'H', non selezionerà solo la prima OGNI volta che rand() è 72?) –

+0

@FrankPresenciaFandos: non è completamente correlato ai dati nella tabella. Genera internamente un numero casuale per ogni riga e quindi ordina per quel numero. – ThiefMaster

2

farla in parte interrogazione

SELECT * FROM translations WHERE en IS NULL OR en='' ORDER BY rand() LIMIT 0,1 
1

Ci sono alcuni modi di fare questo.

@ risposta di ThiefMaster funzionerà - ma "ordine da rand()" ha bei grossi problemi di prestazioni su tabelle di grandi dimensioni. Quindi, popolerei il tuo tavolo con dati di esempio della dimensione approssimativa alla quale vuoi essere in grado di crescere e testare le prestazioni. Se non è un problema, lasciatelo com'è - l'ottimizzazione prematura è la radice di tutto il male!

ci sono alcune alternatives; si basano sull'esecuzione di due query separate; tuttavia, supponendo che tu abbia indici, non dovrebbe essere un problema.

rielaborato per il vostro scenarion, questo diventa:

mysql_query('SELECT @count := COUNT(*) FROM translations WHERE en IS NULL OR en='''); 
mysql_query('SET @offset = CONVERT(FLOOR(RAND() * @count), SIGNED)'); 
mysql_query('PREPARE mystatement FROM "SELECT * FROM translations WHERE en IS NULL OR en='' LIMIT ?, 1"'); 
$res = mysql_query('EXECUTE mystatement USING @offset'); 
$row = mysql_fetch_assoc($res); 
print_r($row); 
+0

Non mi aspetto che questa tabella cresca più di 2000/3000 righe in futuro, ma grazie per aver ampliato le informazioni. Mi è anche piaciuta la citazione "l'ottimizzazione prematura è la radice di tutto il male". –

+0

Non è mio - e qualcuno ha sottolineato che mettere "prematuro" di fronte a praticamente qualsiasi cosa lo fa sembrare male ... –

+0

Scusa, volevo dire, grazie per la citazione che mi ha portato a leggere un sacco di cose interessanti diverse sul internet (; –

Problemi correlati