我有3张桌子
对于会员资料页面,我应该使用一个内部联接查询,如
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个查询:首先查找会员信息,然后再查询会员图片,还有一个查询会员视频?我应该使用哪种方式?
答案 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个不同的查询。 如果说您已经一次性执行了涉及所有成员的某些操作(例如,所有成员的报告),那么请进行内部联接。