2012-04-26 2 views
1

Я пытаюсь вывести список из последних 10 строк, средний рейтинг которых выше 4. Сейчас это делается путем выбора из первой таблицы, а затем проверки среднего значения, если оно указано выше 4, то он добавляется к переменной, если не делает ничего. Это ужасный способ сделать это, особенно если есть более 1000 строк.MySQL Выберите последние 10 строк с помощью WHERE AVG()

Вот два запроса:

SELECT * FROM `CLMS_reviews` WHERE id = 465 ORDER BY date DESC 

SELECT 
rc.name, rr.rating 
FROM `CLMS_reviews_ratings` rr 
LEFT JOIN `CLMS_reviews_categories` rc ON rc.cat_id = rr.cat_id AND rc.website_id = 465 
WHERE rr.review_id = " . $row['id'] . " 
GROUP BY rc.name 

Как совместить это в одном запросе? Я попытался это, но получить недопустимое использование GROUP BY:

SELECT 
rr.review_id 
FROM `CLMS_reviews` r 
LEFT JOIN `CLMS_reviews_ratings` rr ON rr.review_id = r.id 
WHERE r.website_id = 465 AND AVG(rr.rating) > 4 
GROUP BY rr.review_id LIMIT 10 

РЕШЕНИЕ Снизу:

SELECT review_id FROM `CLMS_reviews_ratings` 
WHERE review_id IN ((SELECT id FROM `CLMS_reviews` WHERE website_id = 465)) 
GROUP BY review_id 
HAVING avg(rating) > 4 
LIMIT 10 

ответ

2

Не можете проверить это, но, возможно, это будет делать:

SELECT rr.review_id 
    FROM `CLMS_reviews` r 
    LEFT JOIN `CLMS_reviews_ratings` rr ON rr.review_id = r.id 
WHERE r.website_id = 465 
GROUP BY rr.review_id 
HAVING avg(rr.rating) > 4 
LIMIT 10; 

Если вам нужно фильтровать по совокупности функций, HAVING ваш freiend.

+0

Спасибо, я пошел с вариацией этого, что было быстрее (см. Выше) 0.2s против 60.9s – spyke01

1

Я думаю, вам нужно использовать синтаксис HAVING. Как это:

SELECT 
rr.review_id 
FROM `CLMS_reviews` r 
LEFT JOIN `CLMS_reviews_ratings` rr ON rr.review_id = r.id 
WHERE r.website_id = 465 
GROUP BY rr.review_id 
HAVING AVG(rr.rating) > 4 
LIMIT 10 
Смежные вопросы