MySQL:根据一行的值获取多行

MySQL: Getting multiple rows based on the value of one row

我的 MySQL table 如下所示:

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

总之,我的查询应该 return 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

简短的回答是 "not easily." 有几种方法可以做到这一点,但不是很简单——可能最简单的方法是使用子查询(确切的格式会根据确切的情况而改变) table 等的格式)

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)。

如果你的意思是你想 只包含 的行 lead_id 如果存在 lead_id 和 [=13= 的行] 和 value=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)return 是满足特定条件的 lead_id 的不同列表。我们可以像引用 table 一样引用结果,并在 JOIN 操作中使用它,从 lead_detail [=] return "matching" 行47=]。 (如果对于特定 lead_id,没有包含 value=111field_number=9form_id=1 的行,则内联视图不会 return 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 关键字之后...如果子查询 return 有一个(或多个)行,那么EXISTS 谓词 returns TRUE,否则 returns FALSE。该子查询是外部查询的 "correlated",通过 WHERE 子句中的谓词,将 lead_id 与外部查询行中 lead_id 的值匹配。