从几个表中订购mysql字段

时间:2018-01-26 07:53:14

标签: mysql

我需要实现以下目标并在此过程中遇到问题。 情况如下:

product
-----------------------------
id  sku     is_top  name
-----------------------------
1   aaa     1       Item 1   
2   bbb     0       Item 2
3   ccc     1       Item 3
4   ddd     1       Item 4
5   eee     1       Item 5

product_price
-----------------------------
product_id  price   type
-----------------------------
1           1.23    regular
1           1.01    special
2           3.34    regular
3           3.45    regular
4           2.67    regular
5           5.55    regular

product_wholesale_price
-----------------------------
product_id  price   minimum_count
-----------------------------
1           1.12    10
1           0.95    25
2           2.12    40
3           3.00    40
5           4.00    30

product_special_price
-----------------------------
product_id  price   customer_id
-----------------------------
1           1.00    7
2           2.00    20
3           2.50    45

订购需要像这样:

  1. is_top = 1的产品,在product_price中有记录 type ='special'
  2. is_top = 1且无特殊价格的商品 记录
  3. 所有其他产品
  4. 也按降价按价格排序 订购,使用产品的最高价格。例如, id = 1的产品具有以下价格:1.23,1.01,1.12, 1.00。我们需要使用最高的订单,在这种情况下是1.23。
  5. 所以理想的结果顺序是:

    1. 第1项价格为1.23(最高且有特价)
    2. 第5项,价格5.55(最高)
    3. 第3项,价格3.45(最高)
    4. 第4项,价格2.67(最高)
    5. 第2项,价格3.34(无顶,无特价)
    6. 在单个查询中甚至可以做到这样吗?

2 个答案:

答案 0 :(得分:0)

使用此:

ORDER BY (is_top = 1 AND type = 'special') DESC, is_top DESC, price DESC

当条件为真时,值为1,否则为0,因此使用条件表达式作为DESC排序条件会先放置符合条件的行。

答案 1 :(得分:0)

SELECT p.id, p.name, MAX(pp.price) FROM product p
INNER JOIN product_price pp
ON p.id=pp.product_id
LEFT OUTER JOIN product_special_price psp
ON p.id=psp.product_id
GROUP BY p.id, p.name
ORDER BY MAX(p.is_top AND pp.type='special') DESC,
    MAX(p.is_top AND psp.price IS NULL) DESC, 
    MAX(pp.price) DESC;

此外,如果您想要从几个不同的列中获得最高价格,在select(以及ORDER BY)而不是MAX(pp.price)中,您可以编写类似GREATEST(MAX(pp.price), MAX(COALESCE(psp.price,0)))的内容。