我正在编写一个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
如果我应该为此开辟一个新问题,请告诉我。
答案 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值,以查看是否与连接右侧的行匹配。