【问题标题】:How to sort with multiple conditions in mysql如何在mysql中使用多个条件进行排序
【发布时间】:2017-09-19 08:03:50
【问题描述】:

我有一个如下表,其中包含 2 列 product_id、main_product_id 和 location。 main_product_id 包含主产品的 product_id。

+-------------+--+--------------+--+-----------+
| product_id  |  | main_prod_id |  | location  |
+-------------+--+--------------+--+-----------+
| product1    |  |              |  | AE 34 CH  |
| product2    |  |              |  | AE 46 CH  |
| product3    |  |              |  | V         |
| sub_prod_1  |  | product3     |  |           |
| sub_prod_2  |  | product3     |  |           |
| sub_prod_3  |  | product3     |  | AK 22 AUS |
| sub_prod_4  |  | product3     |  | CI 06 FR  |
| sub_prod_5  |  | product3     |  | TA ee ES  |
| sub_prod_6  |  | product3     |  | V         |
| product4    |  |              |  | CT 01 FR  |
| product5    |  |              |  | V         |
| sub_prod_7  |  | product5     |  |           |
| sub_prod_8  |  | product5     |  |           |
| sub_prod_9  |  | product5     |  | ED 2 ES   |
| sub_prod_10 |  | product5     |  | EN 02 ES  |
| sub_prod_11 |  | product5     |  | TB 03 ES  |
| sub_prod_12 |  | product5     |  | V         |
+-------------+--+--------------+--+-----------+

sub_prod_12 product5 V

我要排序

  • 首先是按位置订购的product1、product2、product4等不在主产品中的产品,(Type1产品)
  • 然后是product3、product5、(Type2 products)等主产品列中的产品
  • 在每个主要产品之后,都会有它的子产品按位置排序。(类型 2 产品的子产品)

所以最终的结果应该是这样的

+-------------+--+--------------+-----------+
| Product_id  |  | main_prod_id | location  |
+-------------+--+--------------+-----------+
| product1    |  |              | AE 34 CH  |
| product2    |  |              | AE 46 CH  |
| product4    |  |              | CT 01 FR  |
| product3    |  |              | V         |
| sub_prod_1  |  | product3     |           |
| sub_prod_2  |  | product3     |           |
| sub_prod_3  |  | product3     | AK 22 AUS |
| sub_prod_4  |  | product3     | CI 06 FR  |
| sub_prod_5  |  | product3     | TA ee ES  |
| sub_prod_6  |  | product3     | V         |
| product5    |  |              | V         |
| sub_prod_7  |  | product5     |           |
| sub_prod_8  |  | product5     |           |
| sub_prod_9  |  | product5     | ED 2 ES   |
| sub_prod_10 |  | product5     | EN 02 ES  |
| sub_prod_11 |  | product5     | TB 03 ES  |
| sub_prod_12 |  | product5     | V         |
+-------------+--+--------------+-----------+

该表可能只有类型 1 的产品或类型 2 及其子产品或所有类型的产品。

到目前为止,我的查询如下

SELECT 
    mt.product_id, mt.main_prod_id, mt.location
FROM
    my_table mt
ORDER BY (CASE
    WHEN
        mt.product_id NOT IN (SELECT 
                main_prod_id
            FROM
                my_table)
            AND (mt.main_prod_id = ''
            OR mt.main_prod_id IS NULL)
    THEN
        mt.location
    WHEN
        mt.product_id IN (SELECT 
                main_prod_id
            FROM
                my_table)
            AND (mt.main_prod_id = ''
            OR mt.main_prod_id IS NULL)
    THEN
        mt.product_id
    ELSE mt.main_prod_id
END) ASC , (CASE
    WHEN
        mt.product_id NOT IN (SELECT 
                main_prod_id
            FROM
                my_table)
            AND (mt.main_prod_id = ''
            OR mt.main_prod_id IS NULL)
    THEN
        0
    WHEN
        mt.product_id IN (SELECT 
                main_prod_id
            FROM
                my_table)
            AND (mt.main_prod_id = ''
            OR mt.main_prod_id IS NULL)
    THEN
        1
    ELSE 2
END) ASC , mt.location ASC

但是通过上面的查询,我得到的是第一个表。

【问题讨论】:

  • 第二个排序条件下的排序顺序是什么?由main_prod_id订购?
  • @KIKOSoftware 你是说这个然后是product3、product5、(Type2 products)等主要产品列中的产品
  • 是的,就是这个。
  • @KIKOSoftware 是的,由 main_prod_id 订购
  • 为了简化排序,您可以始终使用main_prod_id。所以在 product1 的情况下,它将是 product1,这是真的。那你真的可以这样做:ORDER BY main_prod_id, product_id, location.

标签: mysql


【解决方案1】:

你可以试试这个吗?

SELECT 
    product_id, main_prod_id, location
FROM
    my_table
ORDER BY 
    CONCAT(main_prod_id,product_id), location;

评论:

  1. 这可能不是最终解决方案,我还没有测试过,但它可能会给你一些提示。

  2. 在开始编写查询之前,您没有正确整理排序条件。

  3. ORDER BY 表达式中,您无法执行您尝试执行的操作。

【讨论】:

  • 我的查询就快到了。唯一的问题是我无法将 Type 1 产品移到顶部并按位置排序,如您在第二个表中看到的那样
  • 我知道。那么当你使用我给出的查询时发生了什么?不要被它的简单所迷惑。我又改了,加了CONCAT()。我知道它不会在所有情况下都完美运行,但它比你拥有的要好。
猜你喜欢
  • 2022-11-29
  • 2019-09-16
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
相关资源
最近更新 更多