我应该使用什么:内部联接或3个不同的查询?

时间:2012-02-05 15:53:23

标签: php mysql inner-join

我有3张桌子

  1. 构件
  2. 会员视频
  3. 会员照片
  4. 对于会员资料页面,我应该使用一个内部联接查询,如

    SELECT member.*,member_photo.*,member_video.* 
    FROM (member 
        INNER JOIN member_photo ON member.member_id = member_photo.member_id
    ) 
    INNER JOIN member_video ON member.member_id = member_video.member_id
    

    然后将视频推送到视频阵列,将照片推送到照片阵列,但在这里查询会为每个视频找到相同的照片,所以我必须先检查此项是否已添加到数组中。

    或者我应该使用3个查询:首先查找会员信息,然后再查询会员图片,还有一个查询会员视频?我应该使用哪种方式?

5 个答案:

答案 0 :(得分:3)

在我看来,这里的照片和视频是两个不同的东西,特别是它们在应用程序端进入两个不同的结构以便进一步处理,所以我会单独选择它们,即:

SELECT member.*, member_photo.*
FROM member 
INNER JOIN member_photo ON member.member_id = member_photo.member_id

SELECT member.*, member_video.* 
FROM member 
INNER JOIN member_video ON member.member_id = member_video.member_id

答案 1 :(得分:1)

我认为您需要使用三个查询。

考虑一个人有6张照片和3个视频。您的查询将生成18行数据。这没有用,特别是如果实际视频是(a)大而且(b)在查询中选择。

考虑另一个拥有100张照片但不发布视频的人。使用内部联接的查询根本不会表示该人。

考虑一下昨天注册但尚未上传任何内容的人?那个人也不会被代表。

尽可能组合查询是很好的。强行组合像这些不相关的查询是不好的。是的,看起来它们是相关的,但成员的照片列表实际上与同一成员的视频列表无关。如果您可以进行查询操作以生成:

member1     photo1-of-member1   video1-of-member1
member1     photo2-of-member1   video2-of-member1
member1     photo3-of-member1   ...empty...
那时你会很高兴。没有标准的查询运算符,AFAIK。


您可以使用两个内部加入的查询,一个用于收集成员信息和照片,一个用于收集成员信息和视频。但是,这可能会收集成员信息的多个副本(并且重复没有明显的好处),也意味着没有照片或视频(或没有照片或视频)的成员您将看不到任何数据。

显然,您可以使用外部联接而不是内部联接与两个查询,以便您始终可以看到成员数据,但是......好吧,我没有看到任何明显的优势超过三个单独的查询。我想如果通信延迟真的是天文数字(例如,您的应用程序 - 数据库连接是通过卫星链接运行,或者应用程序位于阿根廷,而数据库服务器位于印度),则可能是开销足以使两个查询最好是三个。但是,我想,它必须是不寻常的,以保证使用两个查询而不是三个。

答案 2 :(得分:0)

尝试:

SELECT DISTINCT member.*,member_photo.*,member_video.* FROM (member INNER JOIN member_photo ON member.member_id = member_photo.member_id) INNER JOIN member_video ON member.member_id = member_video.member_id

答案 3 :(得分:0)

我认为您可以通过引入“group by”子句来获得您正在寻找的内容,以便返回的答案按视频分组。

答案 4 :(得分:0)

这取决于您的最终应用程序将要执行的操作。 如果说成员登录时你需要那个成员的信息,那么最好有3个不同的查询。 如果说您已经一次性执行了涉及所有成员的某些操作(例如,所有成员的报告),那么请进行内部联接。