2012-12-10 26 views
6

Xin chào Tôi có một câu hỏi như thế này:mysql RAND() LIMIT

SELECT otel_id 
     FROM YAZILIM_menu_icerik 
     WHERE YAZILIM_menu_icerik.menu_id = 39 
     AND otel_id IN (
         SELECT otel_id 
         FROM YAZILIM_menu_icerik 
         WHERE menu_id =$id 
         ORDER BY RAND() 
         ) 
     LIMIT 0,20 

Nó sẽ hiển thị một cách ngẫu nhiên 20 khách sạn mỗi lần nó hoạt động nhưng thay vào đó, tôi kết thúc nhận được cùng 20 khách sạn mỗi lần. Câu chuyện dài ngắn RAND() dường như không hoạt động và tôi dường như không tìm thấy bất kỳ lỗi logic nào.

EDIT: Sự cố được giải quyết. Mysql không thấy RAND trong() vì vậy đây là cách chính xác để làm điều đó:

SELECT otel_id 
    FROM YAZILIM_menu_icerik 
    WHERE YAZILIM_menu_icerik.menu_id = 39 
    AND otel_id IN (
        SELECT otel_id 
        FROM YAZILIM_menu_icerik 
        WHERE menu_id =$id 
        ) 
ORDER BY RAND() 
LIMIT 0,20 
+1

'ORDER BY RAND() 'là terribly không hiệu quả - có lẽ bạn nên thử và tìm một giải pháp khác. Bất kể, nếu bạn di chuyển 'ORDER BY RAND()' sang bên ngoài ')', nó có hoạt động không? – Swadq

Trả lời

7

hàng của bạn bằng và LIMIT khoản nên được với nhau:

SELECT otel_id 
FROM YAZILIM_menu_icerik 
WHERE YAZILIM_menu_icerik.menu_id = 39 
AND otel_id IN 
(
    SELECT otel_id 
    FROM YAZILIM_menu_icerik 
    WHERE menu_id = $id 
) 
ORDER BY RAND() 
LIMIT 20 

Nó làm cho không có ý nghĩa để có một trần ORDER BY trong truy vấn phụ không có mệnh đề LIMIT vì thứ tự không nhất thiết được bảo toàn trong kết quả của truy vấn bên ngoài.

+2

Vấn đề được giải quyết CHỌN otel_id TỪ YAZILIM_menu_icerik WHERE YAZILIM_menu_icerik.menu_id = 39 VÀ otel_id IN (SELECT otel_id FROM YAZILIM_menu_icerik WHERE menu_id = $ id) TỰ DO RAND() LIMIT 0,20 "; – FreshPro

4

ORDER BY RAND() là giải pháp tồi. Chỉ mục của bạn bị bỏ qua. Tình hình đặc biệt khó khăn với số lượng lớn dữ liệu.

Alternative nếu bạn có khóa chính trên id:

SELECT b1.* FROM Bugs AS b1 JOIN 
(SELECT CEIL(RAND()* (SELECT MAX(id) FROM Bugs)) AS id) AS b2 
WHERE b1.id >= b2.id ORDER BY b1.id LIMIT 1 
Các vấn đề liên quan