我正试图让用户在整个网站上进行全面活动。
我需要在整个数据库中加入许多表,条件是它是一个用户。
我目前所写的是:
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用户,则每个个人资料都有一个“墙”,用于按时间顺序说明用户在网站上的活动。我正在尝试做类似的事情。
答案 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您可能希望进一步过滤结果(即基于日期),以防止在联合中加入大量不会显示的行......