Getting duplicated records in MySQL 试图从两个不同的表中获取数据
Getting duplicated records in MySQL trying to get data from two different tables
我正在做一个 MySQL 查询,它必须 return 来自 table 的所有记录并动态添加两列,一个从其他 table 中获取值最后一个值正在评估其他 table 和 return 中是否存在记录,这取决于它是真还是假。
让我稍微解释一下:
我有一个 table,它存储有关书籍的信息(bookid、bookname、bookdescription),在这个 table 中没有任何重复的记录。
我有第二个 table 存储用户和那些书之间的关系(它存储对书的引用,对用户 ID 的引用,如果这本书是默认的和书的评级)
我的查询现在是这样的:
SELECT DISTINCT b.*,
IF(ub.ub_bookid is not NULL AND ub.ub_userid = :userid , ub.ub_default, 0) AS "default",
IF(ub.ub_bookid is not NULL AND ub.ub_userid = :userid , True, False) AS "visible"
FROM `books` as b LEFT JOIN `users_books` as ub
ON ub.ub_bookid = b.b_id;
(Since I am doing the query from PHP with PDO the value :userid is given at the execution time)
上面的查询假装 return 书 table 中的所有书,对于每本书,查看 table users_books 中是否有一条记录给定 userid,如果它存在,它将 return 默认值和 return 在 "active" 列中为真。在记录不存在的情况下,它将 return false 具有默认值和 false as "active".
我的问题: 当我与同一本书有超过 2 个关系但不同的用户时,查询是 return 重复的条目。如果我删除 DISTINCT
查询 return 的重复条目,如果同一本书有多个记录(但显然不同的用户 ID)。
我不太确定如何 return 只记录 table 书中的记录,并避免重复记录。我一直在尝试使用 GROUP BY
来实现这一点,但由于在我使用它时查询失败,所以无法做到。
如有任何建议或帮助,我们将不胜感激。非常感谢。
好吧,经过几个小时的工作,我发布了这个,并在 8 分钟内用 phpmyadmin 进行了测试,我终于找到了避免重复记录的方法。我只需要在 JOIN ON 处添加和 AND(我不知道这是可能的)。现在我的查询如下所示:
SELECT DISTINCT b.*,
IF(ub.ub_bookid is not NULL AND ub.ub_userid = :userid , ub.ub_default, 0) AS "default",
IF(ub.ub_bookid is not NULL AND ub.ub_userid = :userid , True, False) AS "visible"
FROM `books` as b LEFT JOIN `users_books` as ub
ON ub.ub_bookid = b.b_id AND ub.ub_userid = :userid;
类似的东西(不确定我完全理解你想要什么)?
SELECT b.*,
IF(ub.ub_bookid IS NOT NULL, ub.ub_default, 0) AS 'default',
IF(ub.ub_bookid IS NOT NULL, True, False) AS 'visible'
FROM books b
LEFT JOIN users_books ub ON b.b_id = ub.ub_bookid AND ub.ub_userid = :userid
我正在做一个 MySQL 查询,它必须 return 来自 table 的所有记录并动态添加两列,一个从其他 table 中获取值最后一个值正在评估其他 table 和 return 中是否存在记录,这取决于它是真还是假。
让我稍微解释一下:
我有一个 table,它存储有关书籍的信息(bookid、bookname、bookdescription),在这个 table 中没有任何重复的记录。 我有第二个 table 存储用户和那些书之间的关系(它存储对书的引用,对用户 ID 的引用,如果这本书是默认的和书的评级)
我的查询现在是这样的:
SELECT DISTINCT b.*,
IF(ub.ub_bookid is not NULL AND ub.ub_userid = :userid , ub.ub_default, 0) AS "default",
IF(ub.ub_bookid is not NULL AND ub.ub_userid = :userid , True, False) AS "visible"
FROM `books` as b LEFT JOIN `users_books` as ub
ON ub.ub_bookid = b.b_id;
(Since I am doing the query from PHP with PDO the value :userid is given at the execution time)
上面的查询假装 return 书 table 中的所有书,对于每本书,查看 table users_books 中是否有一条记录给定 userid,如果它存在,它将 return 默认值和 return 在 "active" 列中为真。在记录不存在的情况下,它将 return false 具有默认值和 false as "active".
我的问题: 当我与同一本书有超过 2 个关系但不同的用户时,查询是 return 重复的条目。如果我删除 DISTINCT
查询 return 的重复条目,如果同一本书有多个记录(但显然不同的用户 ID)。
我不太确定如何 return 只记录 table 书中的记录,并避免重复记录。我一直在尝试使用 GROUP BY
来实现这一点,但由于在我使用它时查询失败,所以无法做到。
如有任何建议或帮助,我们将不胜感激。非常感谢。
好吧,经过几个小时的工作,我发布了这个,并在 8 分钟内用 phpmyadmin 进行了测试,我终于找到了避免重复记录的方法。我只需要在 JOIN ON 处添加和 AND(我不知道这是可能的)。现在我的查询如下所示:
SELECT DISTINCT b.*,
IF(ub.ub_bookid is not NULL AND ub.ub_userid = :userid , ub.ub_default, 0) AS "default",
IF(ub.ub_bookid is not NULL AND ub.ub_userid = :userid , True, False) AS "visible"
FROM `books` as b LEFT JOIN `users_books` as ub
ON ub.ub_bookid = b.b_id AND ub.ub_userid = :userid;
类似的东西(不确定我完全理解你想要什么)?
SELECT b.*,
IF(ub.ub_bookid IS NOT NULL, ub.ub_default, 0) AS 'default',
IF(ub.ub_bookid IS NOT NULL, True, False) AS 'visible'
FROM books b
LEFT JOIN users_books ub ON b.b_id = ub.ub_bookid AND ub.ub_userid = :userid