我的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
答案 0 :(得分:1)
如果您想要包含仅针对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
表中的“匹配”行。 (如果特定value=111
的{{1}},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
的每一行,运行EXIST关键字后面的子查询...如果子查询返回一行(或多行),则EXISTS谓词返回TRUE,否则返回FALSE。该子查询通过WHERE子句中的谓词与外部查询“相关”,将lead_detail
与外部查询中的行的lead_id
值相匹配。
答案 1 :(得分:0)
简短的回答是“不容易。”#34;有几种方法可以做到这一点并不是非常简单 - 最简单的方法是使用子查询(确切的格式会根据表格的确切格式而改变等)。
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
的所有数据(或{{1} }})。