[英]MySQL: Getting multiple rows based on the value of one row
我的MySQL表如下所示:
我想获得满足以下所有条件的结果:
form_id
为1 lead_id
排序 lead_id
field_number
9必须为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
如果您的意思是您只想包含 Lead_id的行(如果存在该lead_id
的行, lead_id
该行具有field_number=9
和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
)返回满足特定条件的lead_id
的不同列表。 我们可以像引用表一样引用该结果,并在JOIN
操作中使用该结果以从lead_detail
表返回“匹配”的行。 (如果没有针对特定lead_id
value=111
, field_number=9
和form_id=1
的lead_id
,则内联视图将不会在列表中返回该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
,对于lead_detail
每一行, lead_detail
在EXIST关键字lead_detail
运行子查询...如果子查询返回一(或多)行,则EXISTS谓词返回TRUE,否则返回FALSE。 即子查询“相关联”以外部查询,通过在WHERE子句中的谓词,匹配lead_id
到的值lead_id
从外部查询的行。
简短的回答是“不容易”。 有几种方法并非一帆风顺-可能最简单的方法是使用子查询(确切的格式将根据表的确切格式等而改变)。
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
)的所有数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.