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コードに少しこだわっています。

私はこの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にしたいのです。

4

1 に答える 1

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

また、このユースケースではサブクエリは必要ありません。結合を使用すると、これらを排除できます。

于 2012-11-25T02:24:03.280 に答える