MySQL:根据一行的值获取多行
MySQL: Getting multiple rows based on the value of one row
我的 MySQL table 如下所示:
我希望获得满足以下所有条件的结果:
form_id
是 1
- 按
lead_id
从高到低 排序
field_number
9 因为 lead_id
必须是 111
总之,我的查询应该 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=111
、field_number=9
和 form_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
的值匹配。
我的 MySQL table 如下所示:
我希望获得满足以下所有条件的结果:
form_id
是 1- 按
lead_id
从高到低 排序
field_number
9 因为lead_id
必须是 111
总之,我的查询应该 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=111
、field_number=9
和 form_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
的值匹配。