【问题标题】:MySQL: SELECT existing and non-existing IDsMySQL:选择现有和不存在的 ID
【发布时间】:2021-12-05 18:37:17
【问题描述】:

表格可能如下所示:

id | label
----------
 1 | red
 3 | green
 5 | blue

现在,有一组给定的 ID,必须与数据库进行比较。假设(3, 4, 5)

我正在寻找一个 SELECT 语句,它返回现有的 ID,包括标签和标签 = null 的不存在的 ID。

所以给定(3, 4, 5) 我正在寻找这个结果

id | label
----------
 3 | green
 4 | NULL
 5 | blue

如何在 MySQL/MariaDB 中做到这一点?

在 PostgreSQL 中,它将是 SELECT FROM (VALUES (3), (4), (5)) t(id) 与表的左连接组合。但是,我没有找到 MySQL 的替代品。

【问题讨论】:

  • “id 的给定集合”从何而来?它是另一个查询的结果吗?如果是这样,您可以使用连接来获得结果。如果它来自其他地方,您将需要使用联合或子查询来获得您想要的结果
  • @RisingSun 该集合是通过用户从外部提供的,而不是在数据库内部。

标签: mysql sql mariadb left-join


【解决方案1】:

在 MySql 8.0+ 中,您可以使用 ROW() constructor

SELECT c.id, t.label
FROM ((VALUES ROW(3), ROW(4), ROW(5))) c(id) 
LEFT JOIN tablename t 
ON t.id = c.id;

或使用 CTE:

WITH cte(id) AS (VALUES ROW(3), ROW(4), ROW(5))
SELECT c.id, t.label
FROM cte c LEFT JOIN tablename t 
ON t.id = c.id;

请参阅demo

【讨论】:

    【解决方案2】:

    鉴于问题被标记为,请注意它确实支持VALUESChecked 在 MariaDB 10.3 上:

    WITH u(id) AS (VALUES (3), (4), (5))
      SELECT u.id, t.label
      FROM u LEFT JOIN t ON u.id = t.id;
    
    id label
    3 green
    4 null
    5 blue

    【讨论】:

      【解决方案3】:

      使用子查询作为内联视图,使用UNION ALL

      SELECT
        *
      FROM
      (
                  SELECT 3 AS id
        UNION ALL SELECT 4
        UNION ALL SELECT 5
      )
        AS params
      LEFT JOIN
        some_table
          ON some_table.id = params.id
      

      或者依靠强大的维度表。

      例如,用户在favourite_fruit 表中可能有也可能没有条目,但可以依赖fruit 表来完全填充。

      SELECT
        *
      FROM
        user
      CROSS JOIN
        fruit
      LEFT JOIN
        favourite_fruit
          ON  favourite_fruit.user_id  = user.id
          AND favourite_fruit.fruit_id = fruit.id
      WHERE
            user.id  IN (1,2,3)
        AND fruit.id IN (3,4,5)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-06
        • 2023-03-19
        • 2014-11-20
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多