0

我有这些桌子

餐厅

restaurantID
restaurantName
locationID

地点

locationID
locationName

盘子

dishID
DishName
restaurantID
price

审查

reviewID
dishID
rating

现在我想显示这些东西:

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

但我对 SQL 代码有点坚持。

我有这个自动取款机:

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 而不是根本不显示它。

4

1 回答 1

0

LEFT JOIN 用于您希望包含在您加入的表中找不到匹配项的结果的位置(即,此 restaurant_id 未被任何菜肴使用,或者此菜肴与任何评论不匹配;您仍希望它在分组后的结果)。但是,位置很可能是强制性的,因此如果需要,请使用常规连接。


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

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

于 2012-11-25T02:24:03.280 回答