SQL返回行重复

时间:2017-03-14 10:13:26

标签: php mysql sql

我一直在我的网站内开发一个非常基本的饲料系统,它(应该)显示所有帖子:

  1. 帖子不是来自登录用户
  2. 他们都来自朋友
  3. 并按post_id排序(先获得最新的)
  4. 我对 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是登录用户或该用户是朋友的朋友(如果有意义的话)

    Bug Image

    我已经尝试了所有我知道可以解决问题的组合,但我还是“高级” SQL 的新手,似乎无法找到任何东西

    我试图尽我所能解释我的问题,所以希望有人可以帮助我。我一直在努力解决这个问题,但无济于事,

    干杯。

3 个答案:

答案 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