【问题标题】:Select Column where 3 rows contain separate values - Self Join?选择 3 行包含不同值的列 - 自联接?
【发布时间】: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:

  1. field_id=508 AND meta=red
  2. field_id=507 AND meta=shirt
  3. 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”来编辑记录。

标签: mysql


【解决方案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?
  • 谢谢胡安。我现在正在尝试。
猜你喜欢
  • 2021-07-20
  • 1970-01-01
  • 2021-09-15
  • 2011-05-02
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
相关资源
最近更新 更多