2011-12-21 2 views
1

Я то, что вы бы назвали 'noob' в MySQL. Я могу вставлять/редактировать/выбирать материал, но что-то более продвинутое, чем то, что меня обмахивает. У меня есть две таблицы в моей базе данных:Как вы относитесь к двум таблицам?

Таблица 'обзоры'

id  int(11) 
review varchar(2500) 
game int(11) 
user int(11) 
title varchar(200)` 

и Таблица 'review_rating'

user int(11) 
review int(11)  // Corresponds to `reviews.id` 
like tinyint(1) 

Вот мой вопрос: Можно ли использовать ORDER BY на таблице reviews, чтобы заказать результат по общему числу review_ratings с 'like' = 1 (где 'review' = id таблицы 'reviews'), деленная на tota l количество review_ratings (где «review» = идентификатор таблицы «обзоры»).

Пример:

SELECT * 
FROM `reviews` 
WHERE `game` = ? 
ORDER BY (total number of review_ratings where review = reviews.id and like = 1/
     total number of review_ratings where review = reviews.id) 
LIMIT 0, 10 
+0

У вас нет таблицу с названием «обзор». Не ожидайте, что «review.id» решит что-нибудь полезное. –

ответ

2
SELECT t.review, 
     Score = CASE WHEN TotalReviews<> 0 THEN LikedReviews/TotalReviews ELSE NULL END 
    FROM (
       SELECT *, 
        (SELECT COUNT(*) FROM review_rating WHERE review = r.review) AS TotalReviews , 
        (SELECT COUNT(*) FROM review_rating WHERE review = r.review AND like = 1) AS LikedReviews, 
       FROM review r   
      WHERE game = ? 
     )t 
ORDER BY t.review, Score 
+0

Я получил ваше исправление: http://pastebin.com/c9ps3L2j, но теперь MySQL говорит: «# 1054 - Неизвестный столбец« TotalReviews »в« списке полей »« – Matt

+0

Canyou try: Score = CASE WHEN t.TotalReviews <> 0 THEN t.LikedReviews/t.TotalReviews ELSE NULL END – Akhil

+0

Да, я изменил это, и он возвращает ту же ошибку: o – Matt

2

Я думаю, что это понятнее, чтобы положить его в SELECT пункте:

SELECT reviews.*, 
     (SELECT SUM(like)/COUNT(1) 
      FROM review_ratings 
      WHERE review = reviews.id 
     ) like_ratio 
    FROM reviews 
WHERE game = ? 
ORDER 
    BY like_ratio DESC 
LIMIT 10 
; 

Примечания:

  • Не тестировался; На данный момент я далеко от коробки MySQL.
  • Я думаю, что вы могли бы переместить подзапрос в пункт ORDER BY, если хотите, но, похоже, это полезная вещь для извлечения.
  • Я не уверен, как это будет выглядеть, если у данного обзора нет рейтингов. Для обработки этой ситуации вам может понадобиться выражение CASE.
0

что-то подобное будет упорядочивать по общему review_rating в обзор:

select(count(review.id) as 'total' from reviews join review_rating on review.id = review_rating.review group by review.id) order by total 

математик не совсем то, что вы имели, но, надеюсь, вы получите его

Смежные вопросы