【问题标题】:SQL query based on two columns基于两列的 SQL 查询
【发布时间】:2021-10-01 07:25:44
【问题描述】:

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

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

id item_id parent_id other_columns
1 aaa aaa ...
2 aaa-1 aaa ...
3 aaa-2 aaa ...
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 不相等的地方。

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

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:
    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

    【讨论】:

    • 感谢您的回答!这段代码确实有效,但效率不够高,处理时间太长(200 多秒),即使我只选择了三列。我有一个 16k 行和 35 列的表(~50MB)。
    • @Marin 创建四个索引。 (item_id)(item_id, parent_id)(parent_id, item_id) 的唯一索引,以及 (parent_id) 的索引。测试速度。如果它们有所改善,则查看查询执行计划并删除未使用的索引。请记住 - 如果数据数组发生很大变化,那么最佳索引包可能会改变。
    【解决方案2】:

    我会结合 SQL 查询和 php 代码来解决这个问题。

    起初我会获取所有父母(可变产品)并获取结果。然后在 PHP 中循环遍历结果并使用父 ID 作为下一个查询的参数。

    【讨论】:

    • 这毫无意义。可以在 DBMS 上进行的数据处理必须在 DBMS 上进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多