MySQL - 尝试按不同表中的两个不同列进行排序

时间:2015-03-22 20:40:19

标签: mysql sql

嘿,我在为我想要执行的操作提出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

3 个答案:

答案 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中的第二个值。