用于显示正确数据的sql问题

时间:2012-11-25 02:17:49

标签: sql

我有这些表

餐厅

restaurantID
restaurantName
locationID

位置

locationID
locationName

dishID
DishName
restaurantID
price

查看

reviewID
dishID
rating

现在我想展示这些东西:

`restaurantName`, `locationName`, #dishes from 1 specific restaurant, # of reviews per restaurant

但是我对SQL代码感到有些困惑。

我有这台ATM:

SELECT 
    res.name, l.name, 
    (SELECT COUNT(dishID) FROM dish WHERE restaurantID = res.restaurantID),
    (SELECT COUNT(r.reviewID)) 
FROM 
    restaurant res, location l, review r, dish d 
WHERE 
    res.locationID = l.locationID 
    AND r.dishID = d.dishID 
    AND d.restaurantID = res.restaurantID 
GROUP BY 
    res.restaurantID

它会显示我想要的所有内容,除了没有评论的餐厅。

但我希望计数为0,而不是根本不显示。

1 个答案:

答案 0 :(得分:0)

LEFT JOIN用于您想要包含在您加入的表格中找不到匹配项的结果(例如,此restaurant_id不会被任何菜肴使用,或者这道菜不匹配任何评论;您仍然希望它有一个GROUPING后的结果中的行)。但是,位置很可能是强制性的,因此如果需要,请使用常规连接。


SELECT res.name, l.name, COUNT(dishID) as dish_count, COUNT(r.reviewID) as review_count 
FROM restaurant res
JOIN location l ON res.locationID = l.locationID 
LEFT JOIN dish d on d.restaurantID = res.restaurantID
LEFT JOIN review r on r.dishID = d.dishID 
GROUP BY res.restaurantID

此用例也不需要子查询,使用连接时可以消除这些。