首页 > 解决方案 > 基于两列的 SQL 查询

问题描述

我有一个很大的产品表,我需要一些智能解决方案来找出哪些产品(在 woocommerce 术语中)是简单的、可变的和变化的。

在下面的示例表中,ID 6 和 7 是简单产品(它们没有子级),1 和 4 是可变产品(它们有子级),而 2、3、5 是变体(它们是子级)。

ID item_id parent_id 其他列
1 啊啊啊 啊啊啊 ...
2 aaa-1 啊啊啊 ...
3 aaa-2 啊啊啊 ...
4 bbb bbb ...
5 bbb-1 bbb ...
6 ccc ccc ...
7 ddd ddd ...

我的目标是首先获得简单产品,然后获得可变产品并导入它们,最后获得变体并将它们导入现有的父变量产品。

我有一个简单产品的解决方案:

SELECT *
FROM (
    SELECT *
    FROM $table_name
    WHERE item_id = parent_id
    GROUP BY parent_id
    HAVING COUNT(*) = 1
) AS ONLY_ONCE

我为变量产品(count(*) > 1)尝试了类似的方法,但它不起作用......

对于变化,我有:

SELECT * 
FROM $table_name 
WHERE item_id != parent_id
  1. 简单产品 - 选择 item_id 与 parent_id 相等的所有产品,并且 parent_id 仅出现一次。
  2. 可变产品 - 选择所有 item_id 与 parent_id 相等且 parent_id 出现多次的地方。
  3. 变化 - 选择所有 item_id 和 parent_id 不相等的地方。

我怎么写这三个查询,尤其是第二个?任何帮助表示赞赏。

标签: phpmysqlsql

解决方案


SELECT *,
       CASE WHEN EXISTS ( SELECT NULL
                          FROM test t2
                          WHERE t2.parent_id = t1.item_id
                            AND t2.item_id <> t2.parent_id )
            THEN 'Variable'
            WHEN NOT EXISTS ( SELECT NULL
                              FROM test t3
                              WHERE t3.parent_id = t1.item_id )
            THEN 'Variation'
            ELSE 'Simple'
            END Category
FROM test t1;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b3215cbb3febbdbc4132ee00aac2ad8e


推荐阅读