2016-07-06 139 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显示两次? –