php - 基于两列的 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
- 简单产品 - 选择 item_id 与 parent_id 相等的所有产品,并且 parent_id 仅出现一次。
- 可变产品 - 选择所有 item_id 与 parent_id 相等且 parent_id 出现多次的地方。
- 变化 - 选择所有 item_id 和 parent_id 不相等的地方。
我怎么写这三个查询,尤其是第二个?任何帮助表示赞赏。
解决方案
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
推荐阅读
- java - 如何将值从字符串传输到另一个类
- javascript - Puppeteer:page.screenshot 调整视口大小
- .net - 为什么'using'子句不接受包的名称
- python - Google Cloud Video Intelligence Annotate Video JSON vs 示例代码
- java - Gradle:构建时将子项目文件复制到rootproject
- client-server - 在 mscorlib.dll 中发生 System.ExecutionEngineException'
- r - 为不同比例的图形创建相同的比例
- python - 将巨大的 Networkx 文件加载到 PyQt
- c++ - 通过打包参数传递 unordered_set 作为初始化列表
- api - 无法使用 api 取消设置 Trello 卡片封面颜色