【问题标题】:Calling the minimum value using join function mysql php使用连接函数mysql php调用最小值
【发布时间】:2016-11-21 17:44:04
【问题描述】:

我有两张桌子:

hotels
id, hotel

rooms
id , hotel, type, stay, price

在第二张桌子上,根据房间用餐(住宿)的不同,有不止一排相同房型的不同价格。

我怎样才能只叫第二张桌子上该房型最低价格的一行?

我的代码如下

select h.hotel
     , r.hotel
     , r.stay
     , r.type
     , r.price 
  from hotels h 
  LEFT 
  JOIN rooms r
    ON r.hotel = h.hotel
 where r.type = '$rtype1 
 GROUP 
    BY r.hotel 
 ORDER 
    BY r.price asc

$rtype 是访问者通过输入字段发送的值

【问题讨论】:

标签: php mysql select join


【解决方案1】:

执行此操作的基本方法是使用子查询来获取每家酒店的第一项,然后加入该查询以获取其他详细信息。然而在这种情况下,这不是一个好主意,因为几个房间可能有相同的低价。但是是这样的:-

SELECT h.hotel,
        r.stay,
        r.typee,
        r.price
FROM hotels h 
LEFT OUTER JOIN 
(
    SELECT hotel, 
            MIN(price) AS min_price
    FROM rooms
    WHERE r.type = '$rtype1'
    GROUP BY hotel
) sub0
ON sub0.hotel = h.hotel
LEFT OUTER JOIN rooms r ON r.hotel = sub0.hotel AND AND r.price = sub0.min_price AND r.type = '$rtype1'

另一个是(ab)使用 GROUP_CONCAT 和 SUBSTRING_INDEX 函数。这将按价格顺序获取每个酒店的每个房间的所有详细信息,用逗号分隔(默认来自 GROUP_CONCAT),然后使用 SUBSTRING_INDEX 获取第一个详细信息。当项目可能自然包含分隔符时,这会很困难。

SELECT h.hotel,
        SUBSTRING_INDEX(GROUP_CONCAT(r.stay ORDER BY r.price), ',', 1),
        SUBSTRING_INDEX(GROUP_CONCAT(r.type ORDER BY r.price), ',', 1),
        SUBSTRING_INDEX(GROUP_CONCAT(r.price ORDER BY r.price), ',', 1)
FROM hotels h 
LEFT OUTER JOIN rooms r ON r.hotel = h.hotel AND r.type = '$rtype1' 
GROUP BY h.hotel 

【讨论】:

  • 感谢您的解决方案。它带来了我想要的最低价格,但问题是它没有带来同一行的其他字段,但它带来了具有我正在寻找其房间的酒店名称的第一行的值。
  • 例如:min_price 是 600,r.stay 应该是半膳。但是第一个结果的价格是 700 和 r.stay 的全食宿。所以我从查询中得到的最低价格是 600 并且 r.stay 是全食宿的,这是不正确的。你能帮我吗?非常感谢提前
  • @Mido - 我提出的解决方案不应该那样做(这是我对原始查询的预期结果)
  • 你认为这是因为多行的 min-price 值相同吗?
  • 我的意思是多个房间在酒店中的最低价格相同,我只想要一个结果(任何一个)
猜你喜欢
  • 2011-11-27
  • 2013-09-24
  • 1970-01-01
  • 2013-12-27
  • 2013-03-16
  • 2013-07-25
  • 2019-12-24
  • 2010-10-18
  • 2021-04-14
相关资源
最近更新 更多