我一直在我的网站内开发一个非常基本的饲料系统,它(应该)显示所有帖子:
post_id
排序(先获得最新的)我对 SQL 的一个问题是,当查询数据库表来抓取行时,它会返回一个帖子,但它会是由所有用户发布,而不仅仅是创建它的一个人。
例如,如果用户1
发布了状态"Hi"
,并且数据库中有5个用户;它将获取该帖子,然后将其打印到页面5次,以及每个用户作为海报。 (参见下面的图像示例)
SQL :
SELECT posts.*, users.*, friends.*
FROM posts, users, friends
WHERE posts.poster <> ?
AND users.user_id = posts.poster
AND friends.areFriends = 1 AND (friends.userA = ? AND friends.userB = posts.poster)
OR friends.areFriends = 1 AND (friends.userA = posts.poster AND friends.userB = ?)
ORDER BY posts.post_id desc LIMIT 20
供参考:
posts.poster
是创建帖子的人
users.user_id
是同一个人的身份
friends.areFriends
0 =不是朋友,1 =朋友
friends.userA
/ friends.userB
是登录用户或该用户是朋友的朋友(如果有意义的话)
我已经尝试了所有我知道可以解决问题的组合,但我还是“高级” SQL 的新手,似乎无法找到任何东西
我试图尽我所能解释我的问题,所以希望有人可以帮助我。我一直在努力解决这个问题,但无济于事,
干杯。
答案 0 :(得分:2)
应该是因为你的where
条件。改变它:
WHERE posts.poster <> ?
AND users.user_id = posts.poster
AND friends.areFriends = 1
AND ((friends.userA = ? AND friends.userB = posts.poster) OR (friends.userA = posts.poster AND friends.userB = ?))
在编写条件时,它将返回满足所有其他条件的行或friends.areFriends = 1 AND (friends.userA = posts.poster AND friends.userB = ?)
。因此,即使不符合users.user_id = posts.poster
的行也将被返回。但是当我写条件时,OR用括号括起来。
答案 1 :(得分:2)
制作内部联接的经典方法更具可读性,可帮助您理解代码无效的原因。此外,它是SQL的一种代码约定,因此它也可以帮助其他人(比如我)了解你。
我重新编写了代码以使用INNER JOIN
。试试这个。
SELECT @userId := ?;
SELECT posts.*, users.*, friends.*
FROM friends
JOIN users ON users.user_id =
CASE friends.userA
WHEN @userId
THEN friends.userB
ELSE friends.userA END
JOIN posts ON posts.poster = users.user_id
WHERE friends.userA = @userId OR friends.userB = @userId
ORDER BY posts.post_id DESC LIMIT 20;
确保friends
表中没有欺骗。以下查询将帮助您:
SELECT User1, User2, COUNT(*) as DupeCount
FROM
(
SELECT
CASE WHEN friends.userA < friends.userB THEN friends.userA ELSE friends.userB END AS User1,
CASE WHEN friends.userA < friends.userB THEN friends.userB ELSE friends.userA END AS User2
FROM friends
) AS F
GROUP BY User1, User2
HAVING COUNT(*) > 1
答案 2 :(得分:1)
我认为查询必须返回用户?
的朋友的帖子。先找朋友,发帖,然后找其他数据。
SELECT pp.*, uu.*
FROM (select distinct case when ? = friends.userB then friends.userA else friends.userB end as user_id
from friends
where ? in (friends.userA, friends.userB)
and friends.areFriends = 1
) f
join posts pp on pp.poster = f.user_id
join users uu on uu.user_id = pp.poster