2012-05-30 26 views
1

我需要找的用戶誰有如何改進這種多重聯合查詢?

  1. 共享視頻信用;
  2. a shared production credit;或
  3. 共享組。

這是目前我想出了查詢:

SELECT profile_id FROM productions_productionmember WHERE production_id in 
    (SELECT production_id FROM productions_productionmember WHERE profile_id=?) 
UNION 
SELECT profile_id FROM groups_groupmember WHERE group_id in 
    (SELECT group_id FROM groups_groupmember WHERE profile_id=?) 
UNION 
SELECT profile_id FROM videos_videocredit WHERE video_id in 
    (SELECT video_id FROM videos_videocredit WHERE profile_id=?) 

相關表格:

groups_groupmember 
- profile_id 
- group_id 

videos_videocredit 
- profile_id 
- video_id 

productions_productionmember 
- profile_id 
- production_id 

如何改善此查詢?

+0

是否有配置文件的主表?在這種情況下,您可以使用外連接來獲取個人資料ID符合三個條件中的任何一個 –

+0

您是否遇到此查詢的任何問題? (只有結果)除了性能 –

+0

第一次選擇是什麼? –

回答

0
SELECT DISTINCT p.profile_id 
FROM productions_productionmember p 
left outer join groups_groupmember g on g.profile_id = p.profile_id 
left outer join videos_videocredit v on v.profile_id = p.profile_id 
WHERE v.video_id is not null or g.group_id is not null 
or p.production_id in (SELECT production_id 
        FROM productions_productionmember 
        WHERE profile_id=?) 
+0

juergen - 謝謝你的答案。出於好奇,爲什麼你在這裏使用外連接而不是內連接? – David542

+1

如果您使用內部聯接,則會將結果縮減爲在組成員**和** videocredit中匹配的profile_ids。但是你想要**或**。 –

+0

在嘗試此查詢時,我在'where'子句中找到'未知列'g.production_id「。 – David542

0
Select * 
From productions_productionmember as a, 
    groups_groupmember   as b, 
    videos_videocredit   as c 
Where a.profile_id in (select ...) or 
     b.group_id in (select ...) or 
     c.video_id in (select...) 

希望它可以幫助...

+0

該查詢返回一個空集。 – David542

0

你需要誰是目前工作在三代表的配置文件列表。

 SELECT profile_id FROM productions_productionmember 
    UNION 
    SELECT profile_id FROM groups_groupmember 
    UNION 
    SELECT profile_id FROM videos_videocredit 

如果production_id \ group_id \ video_id可以爲空,那麼IS NOT NULL檢查可以用於這些查詢。

您在查詢中傳遞的profile_id是什麼?如果您需要檢查任何一個表中是否存在配置文件,則可以將where子句放在上述查詢返回的結果上。

 SELECT count(*) 
    from (SELECT profile_id FROM productions_productionmember 
      UNION 
      SELECT profile_id FROM groups_groupmember 
      UNION 
      SELECT profile_id FROM videos_videocredit) subq 
    where subq.profile_id = ? 
0
SELECT pp.profile_id 
FROM productions_productionmember pp 
JOIN productions_productionmember pp2 ON pp.production_id=pp2.production_id 
    AND pp2.profile_id=? 
UNION 
SELECT gg.profile_id 
FROM groups_groupmember gg 
JOIN groups_groupmember gg2 ON gg.group_id=pp2.group_id 
    AND gg2.profile_id=? 
UNION 
SELECT vv.profile_id 
FROM videos_videocredit vv 
JOIN videos_videocredit vv2 ON vv.video_id=vv2.video_id 
    AND vv2.profile_id=? 

這消除了內部查詢。我無法告訴你這是否會提高查詢速度。
該查詢返回可在表中找到兩個或更多的profile_ids。