mysql join возвращает 0 для одного столбца с другими столбцами без изменений

Я хочу объединить несколько столов, как- 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"

0

Решение

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

Вот запрос, который может решить вашу проблему:

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'

Как вы можете видеть здесь, я добавил новое присоединение к простому подзапросу, который выполняет агрегирование, чтобы предоставить мне ожидаемое количество отзывов для каждого ресторана.

Надеюсь, что это поможет вам.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]