在PHP + MySQL中,如何在条件下连接多个表

时间:2010-04-29 08:00:47

标签: php mysql join

我正试图让用户在整个网站上进行全面活动。

我需要在整个数据库中加入许多表,条件是它是一个用户。

我目前所写的是:

SELECT * FROM 
comments AS c 
JOIN rphotos AS r 
ON c.userID = r.userID
AND c.userID = '$defineUserID';

但它返回的是关于用户的一切,但它会重复行。

例如,对于一个用户,他有6张照片和5条评论 所以我希望连接返回11行。

相反,它会返回30个结果:

PhotoID = 1;
CommentID = 1;
PhotoID = 1;
CommentID = 2;
PhotoID = 1;
CommentID = 3;

依旧......

我做错了什么?

我想要实现的目标(示例)

如果您是Facebook用户,则每个个人资料都有一个“墙”,用于按时间顺序说明用户在网站上的活动。我正在尝试做类似的事情。

3 个答案:

答案 0 :(得分:1)

你应该按如下方式进行:

SELECT * FROM  user AS u
LEFT JOIN rphotos AS r ON u.userId = r.userID
LEFT JOIN comments AS c ON u.userId = c.userID
WHERE u.userId = '$defineUserID'

更新以修复愚蠢的错误

这样做是从用户表中选择所有相关用户(在本例中为1),然后在必要时加入其他表,不应重复行。

当您在逻辑上考虑它时,查询也会更有意义。

答案 1 :(得分:1)

  

我做错了什么?

当你使用两个简单的查询时,你正在使用一个复杂的查询。

答案 2 :(得分:1)

如果特定用户有6张照片并且5条评论很正常,那么您将得到30条结果,因为您只是根据用户ID获取所有照片和评论的笛卡尔积。表格结构可以解释可能的解决方案,但如果评论与照片相关,并且您想要获取所有照片以及特定用户发布的评论,您可能会使用以下内容:

SELECT * FROM rphotos p
LEFT JOIN comments c on c.photoID = p.photoID
WHERE p.userID = '$defineUserID' OR c.userID = '$defineUserID';

我个人会把它分成2个查询并分别显示结果,因为混合它们对我没有任何意义,即。使用

SELECT * FROM rphotos p
WHERE p.userID = '$defineUserID';

SELECT * FROM comments c
WHERE c.userID = '$defineUserID';

根据评论进行修改

如果ID字段属于同一类型,则可以使用

之类的内容
select actionID, relatedID, creationDate from
(
select 1 as actionID, photoID as relatedID, creationDate from rphotos
where userID = '$defineUserID'
union
select 2 as actionID, commentID as relatedID, creationDate from comments
where userID = '$defineUserID'
) actions
order by creationDate desc;

对于照片,actionID为1,对于评论为2,使用relatedID字段,您可以查找链接数据(如果需要,否则您可以将其从查询中删除)。

BTW您可能希望进一步过滤结果(即基于日期),以防止在联合中加入大量不会显示的行......