嘿,我在为我想要执行的操作提出SQL时遇到了一些麻烦。
我有一个表列表,其中包含start_price字段和活动字段。我只想拉出活跃的列表(1)。
我想按当前价格订购这些商品。我的列表或出价表中没有当前价格字段。因此,如果listing_id位于出价表中,我想将与出价表中匹配的listing_id相对应的金额字段中的最大值分配给当前价格,否则应将列表中的start_price分配给当前价格。 / p>
这是我到目前为止所提出的。我一直在用不同的东西捣乱,无法提出正确的语法。
SELECT DISTINCT * FROM listings l LEFT JOIN bids b ON l.id = b.listing_id WHERE l.active = 1 ORDER BY l.start_price
答案 0 :(得分:1)
您可以通过多种方式进行计算。我认为关键的想法是你可以在order by
子句中使用列别名。
以下使用相关子查询进行计算,如果没有匹配则使用coalesce()
:
select l.*,
coalesce( (select max(b.price)
from bids b
where b.listing_id = l.listing_id
), l.start_price
) as current_price
where l.active = 1
from listings l
order by current_price;
注意:我有点担心使用出价的最高价格,而不是最近的价格。是否有可能撤回出价,但该行仍在表中?
答案 1 :(得分:0)
我认为这将解决问题。
SELECT
listing_id,
COALESCE(current_price, start_price) current_price
FROM
(SELECT
l.id, b.listing_id, l.start_price, MAX(b.Amount) current_price
FROM
listing l
LEFT JOIN bids b ON l.id = b.listing_id
WHERE
l.active = 1
GROUP BY
l.id, b.listing_id, l.start_price) Data
ORDER BY
COALESCE(current_price, start_price)
在子查询中,我得到start_price和每个项目的最高价格(每个项目一行)。
在主查询中,我使用该信息来定义是否要使用最大值,或者如果它是NULL,则为start_price。
很抱歉,如果有任何错误或错误,但我没有在这里测试它的mysql服务器。
希望这有帮助
答案 2 :(得分:0)
你需要一个GROUP BY和一个aggrate函数,在这种情况下MAX():
SELECT
l.*, /* columnlist here */
COALESCE(MAX(b.current_price), l.start_price) price
FROM
listings l
LEFT JOIN bids b
ON l.id = b.listing_id
WHERE l.active = 1
GROUP BY l.listing_id
ORDER BY price
当列表中没有出价时,MAX函数返回NULL,因此将选择de COALESCE中的第二个值。