2013-12-04 5 views
0

У меня есть две таблицы в моей базе данных, и они выглядят как этотМожет ли avg и count работать вместе в sql?

create table restaurants(
restID number(8) NOT NULL,(PK) 
name varchar(50), 
photo varchar(50)) 

и

create table review_Restaurants(
commentID number(8) NOT NULL, 
reviewDate timestamp, 
commentValue varchar(100), 
rating number(1), 
userName varchar (25) not null, 
restID number(8) not null,); 

и то, что я хочу сделать, это получить лучший ресторан (более высокие рейтинги и обзоры) изображения из базы данных и показать его на экране.

Путь я подошел к этой проблеме является я буду вычислить рейтинг Avg для каждого отдыха, который когда-либо больше, чем 3 будут рассмотрены, а также тех, кто есть комментарии более 5.

select ((avg)rating > 3) as "rating",(count(reviews) > 5) as "review" 
from review_restaurant 
group by restID; 

но не работает , Что я делаю не так?

+1

Состояние должно быть обработано в HAVING, пункт –

ответ

3
SELECT restID 
    , Avg(rating) As "rating" 
    , Count(reviews) As "review" 
FROM review_restaurant 
GROUP 
    BY restID 
HAVING Avg(rating) > 3 
AND Count(reviews) > 5 

Если вы уроните пункт HAVING от выше заявление было бы вернуть все restaraunt обзоры и их средний рейтинг и количество отзывов.

Предложение HAVING очень похож на п WHERE но тонкое различие в том, что раздел HAVING применяется после того, как произошло агрегации.

Другой альтернативный подход заключается в использовании подзапрос

SELECT restID 
    , rating 
    , review 
FROM (
     SELECT restID 
      , Avg(rating) As "rating" 
      , Count(reviews) As "review" 
     FROM review_restaurant 
     GROUP 
      BY restID 
     ) As a_subquery 
WHERE rating > 3 
AND reviews > 5 

Та же логика, как с помощью предложения HAVING применяется здесь тоже ... Мы вычисляем все средние рейтинги и количество обзоров и затем мы применяем наши критерии.


Если вы хотите, чтобы получить соответствующую информацию из таблицы restaurants тогда, когда мы должны сделать наш запрос выше подзапроса и присоединиться к нему обратно в restaurants таблицы.

SELECT restaurants.restID 
    , restaurants.name 
    , restaurants.photo 
    , top_restaurants.rating As average_rating 
    , top_restaurants.review As number_of_reviews 
FROM restaurants 
INNER 
    JOIN (
     SELECT restID 
      , Avg(rating) As "rating" 
      , Count(reviews) As "review" 
     FROM review_restaurant 
     GROUP 
      BY restID 
     HAVING Avg(rating) > 3 
     AND Count(reviews) > 5 
     ) As top_restaurants 
    ON top_restaurants.restID = restaurants.restID 
+0

Разве это не так, как у меня? Я попробую хотя бы попробовать! Можете ли вы также рассказать мне, как мне получить изображения, потому что этот запрос дает мне только restid. – user9517536248

+2

Ну, похоже, у него разные буквы и слова в другом порядке ... например, предложение HAVING. –

+0

@NottyShinchan ответ обновлен :) – gvee

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