2011-03-07 29 views
3

我正在写一个SQL查询,我想向具有基于另一个记录中存在值的值的记录集添加一列表。我有一个左连接加入表,我假设我必须在我的SQL中做一些透视,但我不熟悉表旋转。根据另一个表中的记录是否存在将列添加到select语句中

我现有的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是,它拉场(这是声明的核心)和标签(这是essentailly类别)。 fields_reports表将字段映射到我正在构建的报告。

我需要做的是在我的语句中添加一列,如下所示:如果当前字段在fields_reports表中有记录(57)中传入的报告编号,则将列值赋值为1,否则为0。

编辑:我有查询的另一个问题。现在,查询只能将附加到一个报告的字段提取出来。有没有办法让我可以通过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
You can `SELECT ..., IF(field_reports.reportid=57),1,0), ... FROM ...` 

编辑在WHERE子句中reportid测试将需要被搬走了,不然这个毫无意义的解决方案。 (感谢@戴夫长了。)

+0

这解决了我发布完美的第二个问题。 – 2011-03-07 16:15:15

+0

不好意思混淆你的名字,我不是那个意思。 :)其实你的答案似乎有其他问题。 “GROUP BY”列表不包含“fields_reports.reportid”,并且此字段未汇总在您的解决方案中。 [doc](http://dev.mysql。com/doc/refman/5.5/en/group-by-hidden-columns.html)表示这样的情况:'服务器可以自由地从组中返回任何值,所以结果是不确定的,除非所有的值都相同。 '显然'fields_reports.reportid'的所有值对于我们正在分组的所有特定'fields.id'不一定是相同的。 – 2011-03-07 19:35:28

0

的短语将是:

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

这个工作,因为,当你离开加盟,无行的连接表存在,列仍然存在于结果,但它们均为空。因此,您可以测试此空值以查看您是否与连接右侧的行匹配。

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条款并将条件移至LEFT JOIN fields_reportsON条款。 WHERE,因为它已指定,将您的左连接变成INNER JOIN,所以结果集只会尝试选择fields_reports.reportid = 57的行。如果没有这样的行,则不会返回任何内容,即这样您就无法使您的标志列正常工作。

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

MAX(CASE fields_reports.reportid WHEN 57 THEN 1 ELSE 0 END) AS TheFlagColumn 

它只是附加到您的选择列表中。

+0

虽然这将工作,但我已经授予Todd Hopp答案,因为他在更少的代码中是正确的。 – 2011-03-07 16:20:14

+0

@Dave Long:你知道的更好,但除此之外,我必须说,尽管托德的答案基本上没有问题,但它不能适用于您的查询。我的意思是,你的查询只能选择'reportid = 57',所以Todd定义的标志列是毫无意义的。在我的回答中,我已经解决了刚才在原始问题更新中提出的问题。 – 2011-03-07 16:25:32

+0

我认为很明显,reportid上的WHERE子句测试将不得不被删除。否则,正如您正确指出的那样,“解决方案”将毫无意义。 – 2011-03-07 17:32:03

相关问题