选择 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 行包含不同值的列 - 自联接?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 递归自联接

我需要从 sql 中选择具有不同值的列

自联接、子查询或其他?

如何根据 3 个不同的列在 mysql 中选择行

SQL Server - 使用内部查询自联接更新值的代码

自联接的困难 MySQL 更新查询