代码之家  ›  专栏  ›  技术社区  ›  Osakr

在MySQL中获取重复记录尝试从两个不同的表中获取数据

  •  0
  • Osakr  · 技术社区  · 6 年前

    我正在做一个MySQL查询,它必须返回表中的所有记录,并动态添加两列,一个是从其他表中获取值,最后一个值是评估另一个表中是否存在一个记录,并根据它返回真或假。

    让我再解释一下:

    我有一个表,其中存储有关书籍的信息(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)

    上面的查询假装从书表返回所有的书,对于每一本书,如果表中的用户名书中有一个给定的用户ID的记录,如果它存在,它将返回默认值并在“活动”列中返回一个真值。在记录不存在的情况下,它将返回false“默认”和“false”为“Active”。

    我的问题: 当我与同一本书有两个以上的关系,但用户不同时,查询将返回重复的条目。如果我移除 DISTINCT 如果同一本书有多个记录(但用户ID明显不同),则查询返回重复的条目。

    我真的不知道如何只返回books表中的那么多记录并避免重复它们。我一直想用 GROUP BY 为了实现这一点,但由于在使用查询时失败,因此无法执行此操作。

    任何建议或帮助都将不胜感激。非常感谢。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Adam    6 年前

    一些类似的东西(不确定我是否完全明白你的意思)?

    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
    
        2
  •  0
  •   Osakr    6 年前

    经过几个小时的工作后,我发布了这个,在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;