2016-07-06 6 views
1

나는 'papers'(P), 'authors'(A) 및 'authors__papers'(AP)가있는 테이블 하나에 3 개의 테이블이 있습니다. 게다가. 필요한 것은 작성자 이름이 하나의 열이며, 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

당신은 불필요한',', '연락 후' – HoneyBadger

+0

Thanks @honeybadger – sagi

+0

paper_id가 두 번 나타나지 않도록하는 방법이 있습니까? –

관련 문제