2016-07-06 10 views
1

私は、 'papers'(P)、 'authors'(A)、 'authors__papers'(AP)の3つのテーブルを持っています。同じように。私が必要とするのは、著者名が1つの列に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 

しかし、それはハングアップ(または多分本当に遅いです)。 1つの結果セット内の両方のクエリからこの出力を得るにはどのようなアイデアが必要ですか?すべての論文には1人の連絡先と少なくとも1人の著者がいます。連絡先の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

ありがとう@honeybadger – sagi

+0

paper_id表示を2回表示しないようにする方法はありますか? –