2015-02-11 49 views
0

我有三個表,即根據dms_doc doc_id加入。因此,每個文檔可以有多個部門和合同(存儲在另外兩個表中,但這些表中的信息與此查詢無關)。SQL多個子句只返回一個值

dms_docs  dms_departments  dms_contracts 
id   id     id 
      doc_id    doc_id 
      dep_id    con_id 

到目前爲止,我有以下查詢:

SELECT dms_docs.*, dms_departments.doc_id, dms_departments.dep_id, dms_contracts.doc_id, dms_contracts.con_id 
FROM dms_docs 
JOIN dms_departments 
    ON dms_docs.id=dms_departments.doc_id 
JOIN dms_contracts 
    ON dms_docs.id=dms_contracts.doc_id 
WHERE dep_id = 10 
AND (con_id = 1 OR con_id = 2) 

因此,每個文件可以有多個合同(CON_ID),每個文件可以有多個部門(dep_id),上面的查詢產生的問題如果一個文件有許多合同和/或部門,它會多次返回文件。

例如,在上述查詢中,文檔屬於合同1和合同2,因此它返回2次。如果符合我傳遞給它的任何標準,我如何才能返回結果一次?我猜我需要在這裏某處使用DISTINCT,但我不知道如何正確執行此操作。

+0

如果顯示CON_ID,你會得到兩行關聯到兩個合同文件。你想避免這種情況嗎? – mucio 2015-02-11 12:26:10

+0

@mucio如果一個文件屬於contract.id 1和contract.id 2它們都返回,我只希望返回一個文件。這背後的想法是用戶可以選擇他們想要返回的文件,以便他們可以要求屬於合同1,5,6,7的所有文件,並且如果文件屬於這些合同中的3個,我當前的查詢將返回文件3次,我只希望它只返回一次。 – twigg 2015-02-11 12:29:30

+0

然後將您的select語句更改爲'SELECT distinct dms_docs。*',這樣您將只能看到文檔信息並且沒有重複項 – mucio 2015-02-11 12:32:55

回答

0

如果你只是想要文件信息,我會建議exists。但是,您還需要從其他表格獲取信息。對於這一點,使用group bygroup_concat()

SELECT d.*, group_concat(distinct de.dep_id) as dep_ids, 
     group_concat(distinct c.con_id) as con_ids 
FROM dms_docs d JOIN 
    dms_departments de 
    ON d.id = de.doc_id JOIN 
    dms_contracts c 
    ON d.id = c.doc_id 
WHERE dep_id = 10 AND (con_id IN (1, 2)) 
GROUP BY d.doc_id;