1

我需要找到拥有任何一个的用户

  1. 共享视频信用;
  2. 共享生产信用;或者
  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

如何改进这个查询?

4

4 回答 4

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=?)
于 2012-05-30T05:41:17.533 回答
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...)

希望能帮助到你...

于 2012-05-30T05:51:57.310 回答
0

您需要在 3 个表中的任何一个中存在的配置文件列表。

     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 = ?
于 2012-05-30T06:10:04.430 回答
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,可以在表中找到两个或多个。

于 2012-05-30T06:15:25.970 回答