选择 3 行包含不同值的列 - 自联接?
Posted
技术标签:
【中文标题】选择 3 行包含不同值的列 - 自联接?【英文标题】:Select Column where 3 rows contain separate values - Self Join? 【发布时间】:2018-02-02 15:51:08 【问题描述】:寻找执行选择语句的最佳方法。我认为 SELF JOIN 是最好的方法,但我很难把它放在一起。任何帮助或指导将不胜感激。
我有一个项目元表:
+----------+----------+-------+
| item_num | field_id | meta |
+----------+----------+-------+
| 800 | 508 | red |
| 800 | 507 | shirt |
| 800 | 504 | 2 |
| 700 | 508 | red |
| 700 | 507 | shirt |
| 700 | 504 | 3 |
| 500 | 508 | red |
| 500 | 507 | shirt |
| 500 | 504 | 5 |
+----------+----------+-------+
从表 WHERE 中选择 item_num:
-
field_id=508 AND meta=red
field_id=507 AND meta=shirt
field_id=504 AND meta=2
我最初的陈述想法:
SELECT a.item_num
FROM Table a
JOIN Table b
JOIN Table c
ON a.item_num = b.item_num = c.item_num
AND a.field_id = 508
AND a.meta = red
AND b.field_id = 507
AND b.meta = shirt
AND c.field_id = 504
AND c.meta = 2
GROUP BY a.item_num
LIMIT 1
【问题讨论】:
你期待什么结果? 正如 Raymond 所说,您确实不清楚您希望结果是什么样的。请尝试显示预期结果的示例,以便更轻松地为您提供帮助。 我想得到“item_num”,如果它存在的话。我将使用“item_num”来编辑记录。 【参考方案1】:使用 group by 更容易
SELECT item_num
FROM YourTable
GROUP BY item_num
HAVING COUNT(CASE WHEN field_id=508 AND meta='red' THEN 1 END) > 0
AND COUNT(CASE WHEN field_id=507 AND meta='shirt' THEN 1 END) > 0
AND COUNT(CASE WHEN field_id=504 AND meta='2' THEN 1 END) > 0
也可以写成
HAVING COUNT(CASE WHEN field_id=508 AND meta='red' THEN 1
WHEN field_id=507 AND meta='shirt' THEN 1
WHEN field_id=504 AND meta='2' THEN 1
END) = 3
【讨论】:
对于 field_id 507 和 504? 谢谢胡安。我现在正在尝试。以上是关于选择 3 行包含不同值的列 - 自联接?的主要内容,如果未能解决你的问题,请参考以下文章