2016-04-21 6 views
0

У меня есть список записей в моей таблице. Некоторые из записей являются специальными и имеют флаг «is_premium», установленный в true. Теперь я хочу получить список из своего стола, где все записи премиум-класса находятся наверху, а также заказаны rand. Проблема в том, что после премиум-записей должны отображаться обычные записи. Но их не следует сортировать по ранду. Их следует сортировать по атрибутам, таким как publish_date и update_datetime.MySQL Сортировать по Rand() по результату top

Мое текущее решение этого запроса:

SELECT 
    first_table.*, 
    sorting 
FROM 
    first_table 
LEFT JOIN 
    (
     SELECT 
     id, 
     RAND() AS sorting 
     FROM 
     first_table 
     WHERE 
     is_premium = 1 
    ) p 
     ON p.id = first_table.id 
INNER JOIN 
    (
     SELECT 
     first_table.id, 
     FROM 
     first_table 
     WHERE 
     CURDATE() BETWEEN published_date AND DATE_ADD(published_date,INTERVAL valid_days DAY) 
    ) a 
     ON inserate.id=a.id 
ORDER BY 
    is_premium DESC, 
    sorting DESC, 
    published_date DESC, 
    update_date DESC 

Моя проблема сейчас в том, что не только записи премиум установили значение сортировки, но и обычные записи. и я не знаю, как решить эту проблему.

----- EDIT ----- Спасибо Gordon Linoff Я нашел решение.

SELECT 
    first_table.*    
FROM 
    first_table    
WHERE 
    CURDATE() BETWEEN published_date AND DATE_ADD(published_date,INTERVAL valid_days DAY)    
ORDER BY 
    is_premium DESC, 
    (CASE WHEN is_premium THEN rand()END) 
    published_date DESC, 
    update_date DESC 

ответ

1

Я думаю, вам просто нужно дополнительный ORDER BY ключ:

ORDER BY is_premium DESC, 
     (CASE WHEN is_premium THEN rand() END), 
     sorting DESC, 
     published_date DESC, 
     update_date DESC 
Смежные вопросы