结果被检索两次SQL

时间:2017-09-20 00:39:35

标签: mysql sql pdo

之前我曾经问了类似的问题,但是我认为问题不在于它自己的SQL我将我的问题引向PHP或PDO,这就是为什么我重新问这个问题(以某种方式调用它)。所以基本上我的查询是检索数据两次(exept最后一个对象),我一直试图找出原因但找不到答案。所有曾回复我的其他帖子的人都不知道为什么会这样,这就是为什么我决定将这个问题集中在SQL而不是PHP代码中,这是自我,因为每当查询时都会做出这个决定在PHPMYADMIN上测试出现了相同的重复问题,所以我猜问题就在于SQL本身。先谢谢你。

Desierd结果:查询重新获取数据(不是两次)

示例数据:

    INSERT INTO `personal_posts` (`id`, `body`, `posted_at`, `user_id`, `likes`, `postimg`, `topics`) VALUES
(1, 'post 1', '2017-01-27 00:00:00', 3, 1, NULL, NULL),
(2, 'post 2, '2017-09-10 00:00:00', 1, 1, NULL, NULL),

我的查询:

SELECT personal_posts.id, personal_posts.body, personal_posts.posted_at, personal_posts.postimg, personal_posts.likes, users.`username` FROM users, personal_posts, followers
            WHERE (personal_posts.user_id = followers.user_id
            OR personal_posts.user_id = :useridB)
            AND users.id = personal_posts.user_id
            AND follower_id = :userid
            ORDER BY personal_posts.posted_at DESC;

2 个答案:

答案 0 :(得分:0)

从不FROM子句中使用逗号。 始终使用正确的,明确的JOIN语法。如果您要求数据库首先生成所有表格的笛卡尔积,您会有什么期望?重复似乎很可能。

也许这是您想要的查询:

SELECT pp.id, pp.body, pp.posted_at, pp.postimg, pp.likes, u.username
FROM personal_posts pp JOIN
     users u
     ON pp.user_id = u.id JOIN
     followers f
     ON pp.user_id = f.user_id
WHERE f.follower_id = :userid OR pp.user_id = :useridB
ORDER BY pp.posted_at DESC;

然而,这只是猜测。它至少是可读的。

答案 1 :(得分:0)

当我获得重复记录时,有时我会添加所有表中的所有列以查看重复项的位置。所以,您可以尝试这样的查询(基于Gordon Linoff的答案):

SELECT 'pp',
pp.*,
'u',
u.*,
'f',
f.*
FROM personal_posts pp
JOIN users u ON pp.user_id = u.id
JOIN followers f ON pp.user_id = f.user_id
WHERE f.follower_id = :userid OR pp.user_id = :useridB
ORDER BY pp.posted_at DESC;

(我已在引号中添加' pp'以及其他字段,因此您可以在结果中看到一个表结束而另一个表开始。)

您应该获得包含大量列的结果,但它应该显示记录的不同之处。这表示缺少连接条件或WHERE子句。

这不是最终查询,但它可以帮助您找到问题。