2012-12-10 14 views
6

Witam Mam zapytanie tak: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 

Należy wyświetlić losowo 20 hoteli za każdym razem, to działa, ale zamiast tego jestem kończąc na uzyskanie tego samego 20 Hotel za każdym razem. Długa historia krótka RAND() wydaje się nie działać i nie mogę znaleźć żadnego logicznego błędu.

EDYCJA: Problem rozwiązany. Mysql nie widzi wewnętrzną rand(), więc tutaj jest poprawny sposób to zrobić:

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()' jest strasznie nieskuteczny - powinieneś spróbować znaleźć inne rozwiązanie. Niezależnie od tego, jeśli przeniesiesz 'ORDER BY RAND()' na zewnątrz ')', czy to działa? – Swadq

Odpowiedz

7

zamówienie przez i klauzule graniczne powinny być razem:

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 

To nie ma sensu mieć gołe ORDER BY w podzapytaniu bez klauzuli LIMIT, ponieważ kolejność nie jest zachowana w wynikach zapytania zewnętrznego.

+2

Problem rozwiązany SELECT otel_id OD YAZILIM_menu_icerik GDZIE YAZILIM_menu_icerik.menu_id = 39 i otel_id IN (SELECT otel_id OD YAZILIM_menu_icerik GDZIE menu_id = $ id) ORDER BY RAND() LIMIT 0,20" ; – FreshPro

4

ORDER BY RAND() jest złym rozwiązaniem. Twoje indeksy są ignorowane. Szczególnie trudna sytuacja z dużymi ilościami danych.

alternatywna jeśli masz klucz podstawowy na 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