2012-04-01 60 views
5

Tôi đang tìm cách tạo tiện ích dịch hợp tác. Vì vậy, tôi có một cơ sở dữ liệu mysql và bảng (được gọi là bản dịch), và một kịch bản nhỏ để cho phép người dùng dịch một trang tại một thời điểm.In một hàng ngẫu nhiên từ truy vấn mysql

Nhưng tôi không hoàn toàn thuyết phục với tập lệnh của mình. Tôi không nghĩ nó đủ hiệu quả. Đầu tiên, mysql nhận tất cả các hàng có cột 'en' trống, và sau đó một trong số chúng được hiển thị bằng màn hình trong một thời gian. Có cách nào khác để làm điều này không? Đây là mã:

//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++; 
    } 

tôi đang tìm kiếm một cái gì đó như "echo $ Col [$ Randnum] [ 'es']" hoặc "echo $ tá $ Randnum [ 'es']" thay vì sử dụng toàn bộ vòng lặp trong khi in một hàng ngẫu nhiên duy nhất. Làm thế nào tôi có thể thực hiện điều này? Nếu đó chỉ là vấn đề tối ưu hóa. Nếu bạn có thể đi kèm với một kịch bản hoặc ý tưởng để gán cho $ Col chỉ ONE hàng với một số ngẫu nhiên và trống 'en' col, mà muốn được tốt hơn! (Tôi nghĩ rằng nó không thể là bit cuối cùng này). Hàng 'en' là văn bản nên tôi không biết cách thực hiện other methods Tôi đã thấy xung quanh khi họ sử dụng số với ORDER BY.

Trả lời

7

Bạn có thể sử dụng ORDER BY RAND() LIMIT 1 trong truy vấn của mình để tìm nạp một hàng ngẫu nhiên duy nhất từ ​​cơ sở dữ liệu.

+0

+1 cho là đầu tiên, mặc dù nó là 'RAND() ':) –

+0

sẽ cho nó hoạt động ngay cả với văn bản? Ngay cả khi nó hoạt động, nó sẽ không chọn văn bản có ASCII đầu tiên là rand() nói? (ví dụ, nếu nhiều hàng bắt đầu bằng 'H', nó sẽ không chỉ chọn lần đầu tiên MỌI thời gian mà rand() là 72?) –

+0

@FrankPresenciaFandos: Nó hoàn toàn không liên quan đến dữ liệu trong bảng của bạn. Nó nội bộ tạo ra một số ngẫu nhiên cho mỗi hàng và sau đó đặt hàng theo số đó. – ThiefMaster

2

Làm cho nó ở bên cạnh truy vấn

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

Có một số cách để làm điều này.

@ Câu trả lời của ThiefMaster sẽ hoạt động - nhưng "thứ tự bởi rand()" có các vấn đề về hiệu suất khá lớn trên các bảng lớn. Vì vậy, tôi sẽ điền bảng của bạn với dữ liệu mẫu có kích thước xấp xỉ mà bạn muốn có thể phát triển và kiểm tra hiệu suất. Nếu nó không phải là một vấn đề, hãy để nó như nó - tối ưu hóa sớm là gốc rễ của mọi điều ác!

Có một số alternatives; họ dựa vào việc chạy hai truy vấn riêng lẻ; tuy nhiên, giả sử bạn có chỉ số, đó không phải là vấn đề.

Làm lại cho scenarion bạn, điều này trở thành:

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

Tôi không mong đợi bảng này sẽ lớn hơn 2000/3000 hàng trong tương lai, nhưng cảm ơn bạn đã mở rộng thông tin. Tôi cũng thích câu 'tối ưu hóa sớm là gốc rễ của mọi điều ác'. –

+0

Nó không phải của tôi - và ai đó chỉ ra rằng đặt "sớm" trước mặt khá nhiều bất cứ điều gì làm cho nó âm thanh xấu ... –

+0

Xin lỗi, tôi có nghĩa là, cảm ơn cho báo dẫn tôi đọc rất nhiều thứ thú vị khác nhau trên Internet (; –

Các vấn đề liên quan