2011-03-07 28 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

相關問題