MYSQL查询中的where子句冲突

MYSQL查询中的where子句冲突,mysql,sql,Mysql,Sql,我有3个表,一个是“论文”(p),一个是“作者”(A),另一个是“作者论文”(AP),这是一个带有其他一些值的查找表。我需要的是一个查询,该查询为我提供一列,其中在AP=0的“is_contact_author”字段中显示作者姓名,另一列显示所有作者姓名(串联),其中AP.author_order>0。这些应按P.paper_id进行分组 每个查询本身看起来像: SELECT CONCAT(A.first_name,' ',A.last_name) as contact FROM authors

我有3个表,一个是“论文”(p),一个是“作者”(A),另一个是“作者论文”(AP),这是一个带有其他一些值的查找表。我需要的是一个查询,该查询为我提供一列,其中在AP=0的“is_contact_author”字段中显示作者姓名,另一列显示所有作者姓名(串联),其中AP.author_order>0。这些应按P.paper_id进行分组

每个查询本身看起来像:

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 * 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

但这种情况仍然存在(或者可能是非常缓慢)。您知道如何最好地从一个结果集中的两个查询中获得此输出吗?每篇论文都有一位联系人和至少一位作者。联系人的作者顺序始终为0,作者顺序为1到X。联系人的作者顺序始终为1,而作者顺序始终为0,如果这有帮助或重要的话。

当然很慢,没有连接条件,因此您正在进行笛卡尔连接

试试这个:

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)

尝试使用正确的联接语法,这将帮助您避免此错误。

您应该使用显式的
join
语法(
select..from..join..on..
)。您现在有一个无条件的隐式联接,这将导致笛卡尔乘积。您有一个多余的
,在
联系之后
谢谢@honeybadgerIs有办法避免纸张id显示两次吗?是的,只需选择要显示的列。现在尝试@ddurhami如果我从第二次选择中删除AP.paper\u id,则打开失败,列author\u info.paper\u id未知。我希望paper\u id在输出中只显示一次。
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)