INNER JOIN查询生成数千个结果

时间:2015-05-21 12:47:25

标签: mysql

我希望我能解释这一点,但我正在构建一个INNER JOIN查询的问题。让我试一试:我有一个朋友表,其中有一个 user1 和一个 user2 字段,这两个字段都可以是用户的朋友,具体取决于谁是邀请者,用户或朋友。现在,所有这些朋友当然也是用户自己,他们在各自的页面上发布消息。所有这些消息都存储在一个令人惊讶的名为“messages”的表中。我希望用户能够看到他所有朋友发布的所有消息并建立此消息,我创建了以下INNER JOIN查询:

SELECT friends.user1, friends.user2, messages.message 
FROM friends
INNER JOIN messages
WHERE (friends.user1 = 'Panda' OR friends.user2 = 'Panda') AND (friends.user1 != 'Panda' OR friends.user2 != 'Panda') AND messages.message != '' AND friends.accepted = '1'

(熊猫是课程的测试用户)。 会发生的事情是它确实选择了所有Panda的朋友并且它选择了这些朋友发布的所有消息,但是,我通过此查询获得了数万个结果,因为所有朋友都有一个朋友在结果中发布的消息。让我试着澄清一下:

假设Panda的朋友GalwayMonster发布了帖子:“Lees dit boek!”。 在上述查询的结果中,它将显示如下:

GalwayMonster“Lees dit boek!” PaddyPower“Lees dit boek!” 兄弟“Lees dit boek!” 猴子“Lees dit boek!” (不幸的是,SO不允许我发布截图,因为我还没有足够的声誉,所以我想现在必须这样做 - 对不起)

等等 - 它找到的每个朋友,它都会添加GalwayMonster发布给它的消息,并且它会对任何其他朋友发布的每个帖子都这样做。

显然,我希望向发布该帖的朋友显示正确的信息,如果朋友没有发布任何内容,我根本不希望该朋友出现。

这个查询我做错了什么?我是否需要添加一些内容才能让它只显示属于朋友的正确消息?

我希望我已经说清楚了,但如果您有任何其他问题,请告诉我。万分感谢!

3 个答案:

答案 0 :(得分:0)

尝试使用

messages.message IS NOT NULL

而不是

messages.message != ""

这意味着两件不同的事情。也许这会解决您的问题,但是如果您可以提供表中的一些示例数据以及表中哪些列有帮助。如果您提供的话,我可以更新答案,如果这不解决它。

答案 1 :(得分:0)

您需要查看好友和消息表之间的关系,并调整您的查询,以便它只回收您想要查看的好友的消息。您可能希望使用添加到on的{​​{1}}条件。

目前看来,您应用于邮件的唯一限制是邮件不是空白。

如果没有看到表中的列,则无法提供任何进一步的指示。

答案 2 :(得分:0)

我想我修好了。实际上不确定问题是什么,它给出了期望的结果(我验证结果是正确的)。我将其更改为以下内容,这样也可能对其他人有所帮助:

SELECT friends.user1, friends.user2, messages.message, messages.username, messages.remark, messages.posttime
FROM friends
INNER JOIN messages 
WHERE messages.username != 'Panda' AND (messages.username = friends.user1 OR messages.username = friends.user2) AND (friends.user1 = 'Panda' OR friends.user2 = 'Panda') AND messages.message != '' AND messages.remark = ''

虽然看起来仍然有点长,但它确实有效,现在必须要做。我的一个朋友建议查看UNION或UNION ALL语句,看看它是否有用。无论如何,非常感谢你们帮助我的努力:)来自爱尔兰的干杯!