【发布时间】: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