【问题标题】:MySQL: Getting multiple rows based on the value of one rowMySQL:根据一行的值获取多行
【发布时间】:2015-07-30 12:41:15
【问题描述】:

我的 MySQL 表如下所示:

我希望得到满足以下所有条件的结果:

  • form_id 是 1
  • lead_id从高到低排序
  • field_number 9 表示 lead_id 必须是 111

总之,我的查询应该返回 9 行。那可能吗?

到目前为止,这是我的尝试,但如果可能的话,我真的想避免使用GROUP_CONCAT 以获得更清晰的结果集。

SELECT lead_id, GROUP_CONCAT(field_number, "|", value SEPARATOR "----") AS `values`
FROM lead_detail
WHERE form_id = 1
GROUP BY lead_id
ORDER BY lead_id DESC

【问题讨论】:

  • 你能解释一下“field_number 9 因为lead_id 必须是 111”是什么意思吗?
  • 啊哈....使用 SQL 处理 EAV 模型的乐趣

标签: mysql gravity-forms-plugin


【解决方案1】:

如果您的意思是您想要包含只有一个lead_id 的行,前提是lead_idfield_number=9value=111 存在一行。否则,应排除该 lead_id 的所有行...

你可以这样做:

SELECT d.id
     , d.lead_id
     , d.form_id
     , d.field_number
     , d.value
  FROM ( SELECT e.lead_id
           FROM lead_detail e
          WHERE e.form_id      = 1
            AND e.field_number = 9
            AND e.value        = 111
          GROUP BY e.lead_id
       ) f
  JOIN lead_detail d
    ON d.lead_id = f.lead_id
   AND d.form_id = 1
 ORDER BY d.lead_id DESC

内联视图(别名为f)返回满足特定条件的lead_id 的不同列表。我们可以像引用表一样引用结果,并在JOIN 操作中使用它,从lead_detail 表中返回“匹配”行。 (如果对于特定的lead_id,没有包含value=111field_number=9form_id=1 的行,则内联视图不会在列表中返回该lead_id。)


作为另一种选择,我们可以使用带有相关子查询的 EXISTS 谓词,但这可能效果不佳:

SELECT d.id
     , d.lead_id
     , d.form_id
     , d.field_number
     , d.value
  FROM lead_detail d
 WHERE d.form_id = 1
   AND EXISTS
       ( SELECT 1
           FROM lead_detail e
          WHERE e.form_id      = 1
            AND e.field_number = 9
            AND e.value        = 111
            AND e.lead_id      = d.lead_id
       )
 ORDER BY d.lead_id DESC

这实质上是说,对于来自lead_detail 的每一行,在 EXIST 关键字之后运行子查询...如果子查询返回一个(或多个)行,则 EXISTS 谓词返回 TRUE,否则返回 FALSE。该子查询通过 WHERE 子句中的谓词与外部查询“相关”,将lead_id 与来自外部查询的行中的lead_id 的值相匹配。

【讨论】:

  • 子查询缺少“e”别名。
  • @farjam:是的,我的错。内联视图查询和存在子查询中确实缺少别名分配。我会纠正的。谢谢!我只给出了两种查询模式的示例,还有其他模式也可以使用,例如 d.lead_id IN (subquery) 代替 EXISTS,
【解决方案2】:

简短的回答是“不容易”。有几种方法可以做到这一点并不是非常简单——可能最简单的方法是使用子查询(确切的格式会根据你的表格的确切格式等而改变)

SELECT lead_id, GROUP_CONCAT(field_number, "|", value SEPARATOR "----") AS `values`
FROM lead_detail
WHERE `form_id` = 1
AND `lead_id` = (SELECT `lead_id` FROM `lead_detail` WHERE `field_number` = 9 AND `value` = 111 AND `form_id` = 1) /*This is the subquery*/
GROUP BY lead_id
ORDER BY lead_id DESC

其他选项包括运行两个单独的查询,一个用于提取有问题的form_id(或form_ids),另一个用于提取该form_id(或form_ids)的所有数据。

【讨论】:

  • 运行查询后出现以下错误:子查询返回超过 1 行
  • @farjam:您观察到的行为是预期的。最快的解决方法是将子查询前的“=”替换为“IN”。
猜你喜欢
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2013-05-26
相关资源
最近更新 更多