【问题标题】:Select correct MySQL record with multiple records选择具有多条记录的正确 MySQL 记录
【发布时间】:2014-04-07 14:40:21
【问题描述】:

我很难找到正确的 MySQL 语句。

记录就像

id    leadid    fieldnumber    value
1     1         100            AAA
2     1         101            yes
3     1         102            email1
4     2         100            AAA
5     2         101            no
6     2         102            email2
7     3         100            BBB
8     3         101            yes
9     3         102            email3
10    4         100            AAA
11    4         101            yes
12    4         102            email4

现在我想从每个唯一的leadid中收集字段编号= 102的记录中的值列,其中具有相同leadid的相应记录满足:

(fieldnumber = 100 AND value = "AAA") AND 
(fieldnumber = 101 AND value = "yes")

在本例中,结果为:email1, email4

我已经得到了第一个选择语句 (fieldnumber = 100 AND value = "AAA") 的结果,但是当我添加第二个选择语句 (fieldnumber = 101 AND value = "yes") 时,结果总是零记录。

我认为这是一件愚蠢的事情,但我无法弄清楚或找到正确的说法。

【问题讨论】:

  • 听起来像 EAV 其中is bad
  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。当您问 SQL 问题时,请确保您按名称识别表,这样人们就不必为您发明名称。在关于 SO 的 SQL 问题中,这是一个令人惊讶的常见错误(因此您不是第一个这样做的人,也不会是最后一个,但请不要再这样做了)。

标签: mysql


【解决方案1】:

这里的关键是要认识到您正在同时处理同一个表中的三个记录。您必须将表与自身连接两次——这些称为 self-joins

你需要这样的东西:

SELECT a3.value
  FROM Anonymous_Table AS a1
  JOIN Anonymous_Table AS a2 ON a1.leadid = a2.leadid
  JOIN Anonymous_Table AS a3 ON a1.leadid = a3.leadid
 WHERE (a1.fieldnumber = 100 AND a1.value = "AAA")
   AND (a2.fieldnumber = 101 AND a2.value = "yes")
   AND (a3.fieldnumber = 102)

【讨论】:

  • 你能做多少自加入?当超过4个时,不再有结果。我只是添加了一些更多的“ax.fieldnummer = number”,以便在查询返回的每条记录中获得更多信息
  • 可能没有具体限制——您可以根据需要自行加入。除非您实际上是一台计算机,否则您可能会感到无聊或犯错误,在容量用完之前编写自联接。实际上,您可以合理地期望能够执行大约 100 个自联接,甚至可能更多,但您可能想开始质疑自己在做什么。如果您使用许多自联接,您可能希望将过滤条件添加到 ON 子句:JOIN Anonymous_Table AS a2 ON a1.leadid = a2.leadid AND (a2.fieldnumber = 101 AND a2.value = "yes")
  • 您在我打字时更新了评论……如果您遇到“没有更多结果”,那么您可能会遇到 DBMS 中的错误。您需要显示数据(大概 5 行)和您正在使用的查询。您将证明 4-join 版本的查询返回数据,而 5-join 版本不返回。您还将确保您使用的是最新的稳定版本的 DBMS;它可能是最好用的。
  • 当前数据库为 v5.5.31,在 v5.6.17 上测试...但结果相同
猜你喜欢
  • 2013-07-05
  • 1970-01-01
  • 2021-08-23
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2020-09-15
  • 2014-04-22
相关资源
最近更新 更多