Я хочу объединить несколько столов, как- Categories
, menus
, restaurants
, reviews
, так далее.
вернуть рестораны, которые предоставляют вставленную еду с их ценами.
Все работает кроме numberOfReviews
в reviews
Таблица.
Если в ресторане нет отзывов, то вывод должен быть 0
за numOfReviews
столбец, но должны быть получены другие значения столбца, т.е. цена, имя и т. д.
С помощью следующего запроса я получаю все поля как null
а также count(numReviews)
как 0
:
select r.id
,r.`Name`
,r.`Address`
,r.city
,r.`Rating`
,r.`Latitude`
,a.`AreaName`
,m.`Price`
,count(rv.id)
from `categories` c, `menus` m, `restaurants` r, areas a, reviews rv
where m.`ItemName`="tiramisu"and c.`restaurant_id`=r.`id`
and m.`category_id`=c.id
and r.`AreaId`=a.`AreaId`
и если я не могу соответствовать rv.restaurant_id=r.id
в where
пункт (очевидно).
Где я ошибаюсь? Как мне это решить?
отредактированный
select r.id,
r.`Name`,
r.`Address`,
r.city,
r.`Rating`,
r.`Latitude`,
a.`AreaName`,
m.`Price`,
r.`Longitude`,
r.Veg_NonVeg,
count(rv.id)
from restaurants r LEFT JOIN `reviews` rv on rv.`restaurant_id`=r.`id`
inner join `categories` c on c.`restaurant_id` = r.id
inner join `menus` m on m.`category_id` = c.id
inner join `areas` a on a.`AreaId` = r.`AreaId`
where m.`ItemName`="tiramisu"
Прежде всего, не используйте этот синтаксис старой школы для соединений.
Вот запрос, который может решить вашу проблему:
SELECT R.id
,R.Name
,R.Address
,R.city
,R.Rating
,R.Latitude
,R.Longitude
,A.AreaName
,M.Price
,R.Veg_NonVeg
,COUNT(RV.id) AS numOfReviews
FROM restaurants R
INNER JOIN categories C ON C.restaurant_id = R.id
INNER JOIN menus M ON M.category_id = C.id
INNER JOIN areas A ON A.AreaId = R.AreaId
LEFT JOIN reviews RV ON RV.restaurant_id = R.id
WHERE M.ItemName = 'tiramisu'
GROUP BY R.id, R.Name, R.Address, R.city, R.Rating, R.Latitude, R.Longitude, A.AreaName, M.Price, R.Veg_NonVeg
Я использовал явный INNER JOIN
синтаксис вместо вашего старого школьного синтаксиса, и я изменил соединение с таблицей reviews
для того, чтобы получить ожидаемый результат. GROUP BY
предложение необходимо использовать агрегатную функцию COUNT
, все строки будут сгруппированы по перечисляемым столбцам (каждый столбец, кроме того, который используется функцией).
Вот еще одно решение, которое упрощает GROUP BY
и разрешить изменение SELECT
заявление, не беспокоясь о том, что каждый столбец должен быть частью GROUP BY
пункт:
SELECT R.id
,R.Name
,R.Address
,R.city
,R.Rating
,R.Latitude
,R.Longitude
,A.AreaName
,M.Price
,R.Veg_NonVeg
,NR.numOfReviews
FROM restaurants R
INNER JOIN (SELECT R2.id
,COUNT(RV.id) AS numOfReviews
FROM restaurants R2
LEFT OUTER JOIN reviews RV ON RV.restaurant_id = R2.id
GROUP BY R2.id) NR ON NR.id = R.id
INNER JOIN categories C ON C.restaurant_id = R.id
INNER JOIN menus M ON M.category_id = C.id
INNER JOIN areas A ON A.AreaId = R.AreaId
WHERE M.ItemName = 'tiramisu'
Как вы можете видеть здесь, я добавил новое присоединение к простому подзапросу, который выполняет агрегирование, чтобы предоставить мне ожидаемое количество отзывов для каждого ресторана.
Надеюсь, что это поможет вам.
Других решений пока нет …