使用左连接从其他 table 获取最低价格
Getting minimum price from other table using left join
我正在使用左连接从两个 tables,tour 和 tour_price 中获取数据,但是从定价 table 我无法获取 最低价格 。
这是我的查询
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。感谢 Barmar 的评论。
尝试在 t2.price 上使用 MIN()
功能。
您还需要根据执行 select 的值进行分组,MIN() 除外,因为它是 aggregate function.
SELECT t1.id,t1.tour_title, MIN(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 t1.id,t1.tour_title
ORDER BY MIN(t2.price ) DESC
应该是:
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
,第二个 table 的条件应放在 ON
子句中。否则,没有任何匹配日期的游览将被过滤掉,因为 t2.price
将是 NULL
.
- 不要使用
GROUP BY
中第二个 table 的列,因为如果没有匹配项,它将是 NULL
。所有没有日期的旅行将被组合在一起作为一个结果,这不是您通常想要的。
如果您不希望结果包含没有日期的游览,您应该使用 INNER JOIN
而不是 LEFT JOIN
。如果您对其中的区别感到困惑,请参阅
我正在使用左连接从两个 tables,tour 和 tour_price 中获取数据,但是从定价 table 我无法获取 最低价格 。
这是我的查询
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。感谢 Barmar 的评论。
尝试在 t2.price 上使用 MIN()
功能。
您还需要根据执行 select 的值进行分组,MIN() 除外,因为它是 aggregate function.
SELECT t1.id,t1.tour_title, MIN(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 t1.id,t1.tour_title
ORDER BY MIN(t2.price ) DESC
应该是:
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
,第二个 table 的条件应放在ON
子句中。否则,没有任何匹配日期的游览将被过滤掉,因为t2.price
将是NULL
. - 不要使用
GROUP BY
中第二个 table 的列,因为如果没有匹配项,它将是NULL
。所有没有日期的旅行将被组合在一起作为一个结果,这不是您通常想要的。
如果您不希望结果包含没有日期的游览,您应该使用 INNER JOIN
而不是 LEFT JOIN
。如果您对其中的区别感到困惑,请参阅