Php 使用左联接从其他表获取最低价格

Php 使用左联接从其他表获取最低价格,php,jquery,mysql,join,left-join,Php,Jquery,Mysql,Join,Left Join,我从两个表中获取数据,tour和tour_price使用左联接,但从定价表中无法获取最低价格 这是我的问题 SELECT t1.id,t1.tour_title,t2.price FROM tours t1 LEFT JOIN tour_dates t2 ON t1.id=t2.tour_id WHERE t1.status = '1' AND ( t2.price between 40 AND 100 ) GROUP BY t2.tour_id ORDER BY t2.price D

我从两个表中获取数据,tour和tour_price使用左联接,但从定价表中无法获取最低价格

这是我的问题

SELECT t1.id,t1.tour_title,t2.price 
FROM tours t1 
LEFT JOIN tour_dates t2 ON t1.id=t2.tour_id 
WHERE t1.status = '1' AND ( t2.price between 40 AND 100 ) 
GROUP BY t2.tour_id 
ORDER BY t2.price DESC
我想我需要一些小的改变,但我想不出来

请提供一些帮助。 谢谢。

编辑: 这个答案适用于MS SQL,而不是MySQL。Thanx Barmar的评论

尝试在t2.price上使用
MIN()
函数

除MIN()之外,您还需要根据您选择的值进行分组,因为它是一个

应该是:

SELECT t1.id, t1.tour_title, MIN(t2.price) min_price
FROM tours t1
LEFT JOIN tour_dates t2 ON t1.id = t2.tour_id AND t2.price BETWEEN 40 AND 100
WHERE t1.status = '1'
GROUP BY t1.id
ORDER BY min_price DESC
  • 使用
    MIN(t2.price)
    获取最低价格
  • 由于您使用的是
    LEFT JOIN
    ,第二个表中的条件应该放在
    on
    子句中。否则,没有任何匹配日期的旅行将被过滤掉,因为
    t2.price
    将为
    NULL
  • 不要使用
    groupby
    中第二个表中的列,因为如果不匹配,则该列将为
    NULL
    。然后,所有没有日期的旅行将被分组在一起作为一个结果,这不是您通常想要的结果
如果不希望结果包括没有日期的旅行,则应使用
内部连接
,而不是
左连接
。如果您对差异感到困惑,请参阅


在您的选择行中使用Barmar的注释MySQL不要求您将所有其他列都放在
分组依据中。如果
t1.id
是唯一的id,通常情况下,按
t1.tour\u title
分组是多余的。哦,糟糕,我像
mssql
一样阅读标签,而不是
mysql
。我会更新我的答案。谢谢你的建议Barmar先生,最后一个建议,我还有其他条件,比如评级和便利性,那么这些条件是否应该像你建议的那样出现在ON子句中?如果它们是
tour_dates
表中的标准,它们应该出现在
ON
子句中。如果它们是
巡演
表中的标准,那么它们应该位于
中的
位置
。这很容易理解:如果没有匹配的
巡演日期
,那么该表中的所有内容都将为
,并且与
的所有比较都是假的(当然,
为空
除外)。
SELECT t1.id, t1.tour_title, MIN(t2.price) min_price
FROM tours t1
LEFT JOIN tour_dates t2 ON t1.id = t2.tour_id AND t2.price BETWEEN 40 AND 100
WHERE t1.status = '1'
GROUP BY t1.id
ORDER BY min_price DESC