2016-07-06 108 views
1

我有3個表,一個'papers'(P),一個'authors'(A),另一個'authors__papers'(AP),這是一個查詢表和其他一些值以及。我需要的是一個單一的查詢,它給了我一列包含AP = 0中'is_contact_author'字段的作者姓名,另一列中所有作者姓名(連續),其中AP.author_order> 0。 P.paper_id。在MYSQL查詢中衝突where子句

本身每個查詢的樣子:

SELECT CONCAT(A.first_name,' ',A.last_name) as contact FROM authors A 
join authors__papers AP on AP.author_id = A.author_id 
WHERE AP.is_contact_author = 0 

和:

SELECT AP.paper_id, GROUP_CONCAT(CONCAT(A.first_name,' ',A.last_name) ORDER BY AP.author_order SEPARATOR ', ') as authors FROM authors A 
join authors__papers AP on AP.author_id = A.author_id 
WHERE AP.author_order > 0 
GROUP BY AP.paper_id 

每個那些回報的預期單獨的結果。我嘗試了一個子查詢:

SELECT * FROM 
(
SELECT CONCAT(A.first_name,' ',A.last_name) as contact FROM authors A 
join authors__papers AP on AP.author_id = A.author_id 
WHERE AP.is_contact_author = 1 
) contact, 

(
SELECT AP.paper_id, GROUP_CONCAT(CONCAT(A.first_name,' ',A.last_name) ORDER BY AP.author_order SEPARATOR ', ') as authors FROM authors A 
join authors__papers AP on AP.author_id = A.author_id 
WHERE AP.author_order > 0 
GROUP BY AP.paper_id 
) author_info 

但是,掛起(或可能只是真的很慢)。任何想法如何最好地從一個結果集中的兩個查詢中獲取此輸出?每篇論文都有一個聯繫人和至少一個作者。聯繫人的author_order始終爲0,作者爲1到X.聯繫人的is_contact_author始終爲1,對於作者始終爲0(如果有幫助或重要)。

+1

您應該使用明確的'join'語法('select..from..join..on..')。你現在有一個沒有條件的隱式連接,這導致了一個笛卡爾積。 – HoneyBadger

回答

3

當然它很慢,沒有連接條件,所以你正在做笛卡兒連接。

試試這個:

SELECT author_info.paper_id, author_info.authors, contact.contact FROM 
(
    SELECT AP.paper_id as paper_id2,CONCAT(A.first_name,' ',A.last_name) as contact FROM authors A 
    join authors__papers AP on AP.author_id = A.author_id 
    WHERE AP.is_contact_author = 1 
) contact 
INNER JOIN 
(
    SELECT AP.paper_id, GROUP_CONCAT(CONCAT(A.first_name,' ',A.last_name) ORDER BY AP.author_order SEPARATOR ', ') as authors 
    FROM authors A 
    join authors__papers AP on AP.author_id = A.author_id 
    WHERE AP.author_order > 0 
    GROUP BY AP.paper_id 
) author_info 
ON(contact.paper_id = author_info.paper_id) 

嘗試使用連接的正確的語法,這將幫助你避免這種錯誤。

+0

在'contact'後面有一個多餘的''','' – HoneyBadger

+0

Thanks @honeybadger – sagi

+0

有沒有辦法避免讓paper_id顯示兩次? –