根据另一个表中记录的存在将列添加到select语句

时间:2011-03-07 15:58:50

标签: mysql sql

我正在编写一个SQL查询,我想在记录集中添加一个列,该列的值基于另一个表中记录的存在。我有一个左连接加入表,我假设我必须在我的SQL中做一些转轴,但我不熟悉表转动。

我现有的SQL是

SELECT tabs.name,tabs.id AS tabid,tabs.sort,fields.id AS fieldid, fields.label
FROM tabs
INNER JOIN fields
  ON tabs.id = fields.tabid
LEFT JOIN fields_reports
  ON fields_reports.fieldid = fields.id
WHERE fields_reports.reportid = 57
GROUP BY fields.id
ORDER BY tabs.sort, fields.id

SQL中发生的事情是它拉取字段(这是语句的核心)和标签(它们是特定类别)。 fields_reports表将字段映射到我正在构建的报告。

我需要做的是在我的语句中添加一个列:如果当前字段在fields_reports表中有记录,并且传入了报告编号(57),则将列值赋值为1,否则为0. / p>

修改:我的查询还有另一个问题。现在查询只是拉动附加到一个报告的字段。有没有一种方法,我可以做一个子查询从fields_reports表中选择,以便我可以提取所有字段,然后将列附加到报告?

这是现在提取记录的查询,但只提取一个报告字段

SELECT tabs.name,tabs.id AS tabid,tabs.sort,fields.id AS fieldid, fields.label,
  CASE WHEN fields_reports.id IS null THEN 0 ELSE 1 END AS inReport
FROM fields
INNER JOIN tabs
  ON tabs.id = fields.tabid
LEFT JOIN fields_reports
  ON fields_reports.fieldid = fields.id
WHERE fields_reports.reportid = 57
GROUP BY fields.id
ORDER BY tabs.sort, fields.id

如果我应该为此开辟一个新问题,请告诉我。

3 个答案:

答案 0 :(得分:4)

You can `SELECT ..., IF(field_reports.reportid=57),1,0), ... FROM ...`

编辑需要删除WHERE子句中对reportid的测试,否则这作为解决方案毫无意义。 (感谢@Dave Long。)

答案 1 :(得分:1)

看看我对你的剧本做了什么:

SELECT tabs.name,tabs.id AS tabid,tabs.sort,fields.id AS fieldid, fields.label
FROM tabs
INNER JOIN fields
  ON tabs.id = fields.tabid
LEFT JOIN fields_reports
  ON fields.id = fields.id AND fields_reports.reportid = 57
GROUP BY fields.id
ORDER BY tabs.sort, fields.id

注意到不同的东西?我删除了WHERE子句并将条件移动到ON的{​​{1}}子句。 {I}指定的LEFT JOIN fields_reports将您的LEFT JOIN转换为INNER JOIN,因此结果集只会尝试选择WHERE的行。如果没有这样的行,则不会返回任何行,即这样就不会让你的标志列工作。

但现在可以定义它,例如,像这样:

fields_reports.reportid = 57

只需将其附加到您的选择列表中即可。

答案 2 :(得分:0)

这句话将是:

select ....
     , case when LeftJoinedTable.column is null then 0 else 1 end
  from ....

这是有效的,因为当你离开连接并且连接表中不存在行时,列仍然存在于结果中,但它们都是空的。因此,您可以测试此null值,以查看是否与连接右侧的行匹配。