【问题标题】:mysql: Select all rows and compare with other tablemysql:选择所有行并与其他表进行比较
【发布时间】:2020-04-10 16:05:57
【问题描述】:

我有两个表,需要从第一个表中获取所有行,然后检查第二个表中的哪些值与第一个表匹配。

我的目标是获得所有所谓的“成就”,然后检查用户达到了哪一项。

成就

+---------------+-------------+
| achievementID | description |
+---------------+-------------+
| 1             | goal1       |
| 2             | goal2       |
| 3             | goal3       |
+---------------+-------------+

成就用户

+---------------------+---------------+--------+
| achievementRecordID | achievementID | userID |
+---------------------+---------------+--------+
| 1                   | 1             | 1      |
| 2                   | 1             | 3      |
| 3                   | 4             | 2      |
| 4                   | 3             | 1      |
+---------------------+---------------+--------+

我检查userID = 1 的结果的查询的期望结果将类似于

+---------------+---------------+--------------+
| achievementID | description   | solvedByUser |
+---------------+---------------+--------------+
| 1             | goal1         | true         |
| 2             | goal2         | false        |
| 3             | goal3         | true         |
+---------------+---------------+--------------+

新列solvedByUser 基本上可以是任何数据类型(布尔型、整数型、...)。 我只需要一份所有可用成就的列表,然后查看用户达到了哪一项。

【问题讨论】:

    标签: mysql sql join left-join


    【解决方案1】:

    你可以left joinachievments表和achievement_user:

    select a.*, (au.userID is not null) solvedByUser
    from achievements a
    left join achievement_user au 
        on  au.achievementID = a.achievementID
        and au.userID = 1
    

    solvedByUser 是一个0/1 标志,指示给定用户是否达到了给定成就。

    【讨论】:

      【解决方案2】:

      我认为您需要左连接 -

      SELECT A.achievementID, A.description, CASE WHEN AU.userID IS NOT NULL THEN 'true' ELSE 'false' solvedByUser
      FROM achievements A
      LEFT JOIN achievement_user AU ON A.achievementID = AU.achievementID
                                   AND userID = 1;             -- YOUR INPUT ID
      

      【讨论】:

        【解决方案3】:

        你需要一个左连接:

        select a.*, 
          case when u.achievementID is null then 'false' else 'true' end solvedByUser
        from achievements a left join achievement_user u 
        on u.achievementID  = a.achievementID and u.userid = 1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-10
          相关资源
          最近更新 更多