我正在执行一个MySQL查询,该查询必须从一个表返回所有记录并动态添加两列,一个从另一个表中获取值,最后一个值是评估另一个表中是否存在记录并返回true或false取决于它。
让我解释好一点:
我有一个表,该表存储有关书籍的信息(bookid,bookname,bookdescription),该表中没有任何重复的记录。 我还有第二个表,用于存储用户和那些书之间的关系(它存储了对书的引用,对用户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;
(因为我正在使用PDO从PHP进行查询,所以在执行时给出了:userid值)
上面的查询假装返回book表中的所有书籍,并针对每本书籍查看表user_books中是否存在具有给定userid的记录,如果该记录存在,它将返回default的值并返回a在“活动”列中为true。在记录不存在的情况下,它将返回false(具有默认值)和false(表示“活动”)。
我的问题:当我与同一本书有2个以上的关系但用户不同时,查询将返回重复的条目。如果我删除了DISTINCT
,如果同一本书有多个记录(但显然有不同的用户ID),则查询将返回重复的条目。
我不太确定如何只返回books表所具有的记录,并避免重复记录。我一直在尝试使用GROUP BY
来实现此目的,但是由于查询在使用时失败而无法执行。
任何建议或帮助将不胜感激。非常感谢。
答案 0 :(得分:1)
有些事情(不确定我是否完全理解你想要什么)?
512 * rand()
答案 1 :(得分:0)
好几个小时的工作之后,我发表了这篇文章,在用phpmyadmin测试8分钟后,我终于找到了一种避免重复记录的方法。我只需要在JOIN ON上添加AND 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;