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

时间:2015-05-18 21:10:25

标签: mysql gravity-forms-plugin

我的MySQL表如下所示:

enter image description here

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

  • 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

2 个答案:

答案 0 :(得分: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表中的“匹配”行。 (如果特定value=111的{​​{1}},field_number=9form_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} }})。