【问题标题】:MySQL syntax group by restaurant with cheaper menuMySQL 语法按餐厅分组,菜单更便宜
【发布时间】:2009-11-02 09:34:39
【问题描述】:

这是我对 MySQL (MySQL: 5.0.51a) 的 SQL 请求。我想要一份带有他便宜菜单的餐厅列表:

select r.id, rm.id, rm.price, moyenne as note, 
get_distance_metres('47.2412254', '6.0255656', map_lat, map_lon) AS distance 

from restaurant_restaurant r 
LEFT JOIN restaurant_menu rm ON r.id = rm.restaurant_id 

where r.isVisible = 1 

group by r.id 
having distance < 2000 
order by distance ASC 
limit 0, 10

如果我不使用 group by,我有一个我所有菜单和餐厅的列表,但是当我使用它时,看起来他为我的餐厅随机选择了一个菜单。

感谢您的帮助。

【问题讨论】:

    标签: sql mysql group-by


    【解决方案1】:

    类似的东西不起作用:

    SELECT r.id as restaurant_id, rm.id as menu_id, rm.price as price, r.moyenne AS note, 
    get_distance_metres('47.2412254', '6.0255656', map_lat, map_lon) AS distance 
    
    FROM restaurant_restaurant r 
    LEFT JOIN restaurant_menu rm ON r.id = rm.restaurant_id 
    
    WHERE r.isVisible = 1 
    
    GROUP BY r.id 
    HAVING MIN(price) AND distance < 120000
    ORDER BY price ASC, distance ASC 
    LIMIT 0, 10
    

    【讨论】:

    • 这个解决方案给了我最低价格,但我仍然有错误的 menu.id
    • 我在 HAVING 子句中添加了 MIN(price) 而不是 SELECT 子句
    【解决方案2】:

    是的,如果您选择的列在功能上不依赖于 GROUP BY 子句,您将在 MySQL 中获得随机 (*) 选择。这不是 ANSI 标准 SQL 和其他数据库会给你一个错误。

    您是否希望所有餐厅的菜单价格低于某个级别?如果这很容易,只需添加一个

    WHERE rm.price<1000   -- or whatever price
    

    条款。

    但是,如果您的意思是要列出具有最低价格菜单的餐厅,那么您所追求的就是groupwise minimum,并且在 SQL 中执行起来非常棘手。有quite a few 方法来攻击它;另见this question。这是一个带有外部自空连接的例子:

    SELECT
        r.id, rm.id, rm.price, r.moyenne AS note,
        get_distance_metres('47.2412254', '6.0255656', map_lat, map_lon) AS distance 
    FROM restaurant_restaurant AS r
    JOIN restaurant_menu rm ON r.id=rm.restaurant_id
    LEFT JOIN restaurant_menu AS no_menu ON r.id=no_menu.restaurant_id AND no_menu.price<rm.price
    WHERE no_menu IS NULL
    AND r.isVisible=1
    AND distance<2000
    AND rm.price<1000   -- if you only want restaurants with a menu cheaper than certain price
    ORDER BY distance
    LIMIT 10;
    

    请注意,与 groupwise 最大值的许多变体一样,如果单个餐厅有两个价格相同的最便宜菜单,这将为您提供两个结果。

    (*: 实际上,您倾向于获取 MySQL 存储顺序中的第一行,很多时候这将是您放入数据库的第一行,这有点陷阱,因为有时这就是您想要的看起来它正在工作,直到由于某种原因顺序更改并且一切都出错了。危险!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-21
      • 2016-08-04
      • 1970-01-01
      • 2011-06-23
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多