MySQL SELECT从一组数字中排序一个数字

时间:2012-07-10 20:39:54

标签: mysql select case rank

我有一些来自SELECT查询的数据行,只有几个价格(比如本例中的三个)。一个是我们的价格,一个是竞争对手的价格,一个是竞争对手的价格。我想添加一个列,与其他两个价格相比,吐出我们的价格等级;如果我们的价格是最低的,它会吐出数字1,如果最高价格会吐出它的数字。

这样的事情:

Make |  Model  |  OurPrice | Comp1Price  | Comp2Price | Rank |  OutOf
MFG1    MODEL1     350         100           500         2        3
MFG1    MODEL2     50          100           100         1        3
MFG2    MODEL1     100         NULL          50          2        2
MFG2    MODEL2     9999        500           NULL        2        2

- 如上所述,竞争对手的价格有时会为NULL,我相信这就是我的问题所在。我尝试了CASE,只在一个竞争对手上有效,但是当我添加AND语句时,它会将所有NULL排出队列。有没有更好的方法通过MySQL查询执行此操作?

SELECT
      MT.MAKE as Make,
      MT.MODEL as Model,
      MT.PRICE as OurPrice,
      CT1.PRICE as Comp1Price,
      CT2.PRICE as Comp2Price,
      CASE
         WHEN MT.PRICE < CT1.PRICE AND MT.PRICE < CT2.PRICE
         THEN 1 END AS Rank
      (CT1.PRICE IS NOT NULL) + (CT2.PRICE IS NOT NULL) + 1 as OutOf
  FROM mytable MT

LEFT JOIN competitor1table as CT1 ON CT1.MODEL = MT.MODEL
LEFT JOIN competitor2table as CT2 ON CT2.MODEL = MT.MODEL

ORDER BY CLASS

2 个答案:

答案 0 :(得分:1)

未经测试,但您可以尝试:

SELECT
    a.MAKE AS Make,
    a.MODEL AS Model,
    a.PRICE AS OurPrice
    MAX(CASE WHEN a.compnum = 1 THEN pricelist END) AS Comp1Price,
    MAX(CASE WHEN a.compnum = 2 THEN pricelist END) AS Comp2Price,
    FIND_IN_SET(a.PRICE, GROUP_CONCAT(a.pricelist ORDER BY a.pricelist)) AS Rank,
    COUNT(a.pricelist) AS OutOf
FROM
(
    SELECT MAKE, MODEL, PRICE, PRICE AS pricelist, 0 AS compnum
    FROM mytable

    UNION ALL

    SELECT a.MAKE, a.MODEL, a.PRICE, CT1.PRICE, 1
    FROM mytable a
    LEFT JOIN competitor1table CT1 ON a.MODEL = CT1.MODEL

    UNION ALL

    SELECT a.MAKE, a.MODEL, a.PRICE, CT2.PRICE, 2
    FROM mytable a
    LEFT JOIN competitor2table CT2 ON a.MODEL = CT2.MODEL
) a
GROUP BY
    a.MAKE, a.MODEL

答案 1 :(得分:0)

(CT1.PRICE IS NOT NULL AND CT1.PRICE < MT.PRICE) + (CT2.PRICE IS NOT NULL AND CT2.PRICE < MT.PRICE) + 1 as Rank