mysql 使用3个不同的表进行查询

esyap4oy  于 2023-05-28  发布在  Mysql
关注(0)|答案(1)|浏览(108)

这是我的第一篇文章,我道歉,如果我没有包括正确的信息或格式关闭。我想确定在客户订单中,哪个城市的哪些餐厅受欢迎
还有一张table:customers客户表包括 id(PK),first name,last name,city_id(FK),email
餐厅餐桌:
| id|餐厅名称|联系方式|城市ID|
| - -----|- -----|- -----|- -----|
| 一个|塔可钟|30269 W 8th Street,洛杉矶,CA|一个|
| 2|地铁|1728 S Western Avenue,洛杉矶,CA|一个|
| 3|麦当劳|1100 Fillmore Street,弗朗西斯科,CA| 3|
| 4|温蒂餐厅|200 SW 8th Street,迈阿密,FL| 4|
| 5个|JR寿司|86 W百老汇,纽约,NY| 2|
城市表:
| id|城市名称|
| - -----|- -----|
| 一个|洛杉矶|
| 2|纽约|
| 3|弗朗西斯科|
| 4|迈阿密|
delivery_orders表:
| 订单id|订货时间|客户ID|餐厅ID|总价|
| - -----|- -----|- -----|- -----|- -----|
| 一个|2020-06-12 12:04:32|一个|3|二十五块七十五|
| 2| 2020-06-18 20:20:19| 2|一个|三十二点六十八|
| 3| 2022-09-12 16:23:16| 3| 3|二十七点五十三分|
我尝试了以下查询:

SELECT restaurants.name, city.name, COUNT(*) AS popular_restaurant
FROM restaurants
INNER JOIN city
ON restaurants.city_id = city.id
INNER JOIN delivery_orders
ON delivery_orders.restaurant_id = restaurants.restaurant_id
GROUP BY restaurants.name, city.name
HAVING COUNT(restaurants.name) > 0
ORDER BY popular_restaurant DESC;

它输出餐厅名称、城市名称和popular_restaurant计数。城市名称多次重复。我只想根据delivery_orders表列出每个城市最受欢迎的餐厅。

w6lpcovy

w6lpcovy1#

下面是一种限制每个城市返回的行数的方法,第一个例子是每个城市只返回一行:

WITH popular_restaurants AS (
    SELECT city, restaurant, COUNT(*) AS popularity_score,
           DENSE_RANK() OVER (PARTITION BY city ORDER BY COUNT(*) DESC) AS rn
    FROM delivery_orders
    GROUP BY city, restaurant
)
SELECT city, restaurant, popularity_score
FROM popular_restaurants
WHERE rn = 1;

但是,如果您希望列出“等顶”餐厅,则使用dense_rank()[* 或rank()*]

WITH popular_restaurants AS (
    SELECT city, restaurant, COUNT(*) AS popularity_score,
           DENSE_RANK() OVER (PARTITION BY city ORDER BY COUNT(*) DESC) AS rank
    FROM delivery_orders
    GROUP BY city, restaurant
)
SELECT city, restaurant, popularity_score
FROM popular_restaurants
WHERE rank = 1;

请注意,要获得其他属性(如餐厅名称),请在最终选择中连接所需的表,连接的表在按查询分组中是不必要的。
还要注意,当使用row_number()、dense_rank()或rank()时,您可以通过添加到order by子句来“微调”结果。特别注意,在两个示例中使用计数的降序。也许与上面的第一个例子更相关,你可以添加一些“平局打破者”逻辑。ORDER BY COUNT(*) DESC, restaurant。如果您想通过餐厅名称来决定,那么您需要通过查询连接组内的表。

相关问题