MySQL:SELECT 个现有和不存在的 ID

MySQL: SELECT existing and non-existing IDs

table 可能如下所示:

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

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

我正在寻找 SELECT 声明 returns 现有 ID,包括标签和不存在的标签 = null。

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

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

如何在 MySQL/MariaDB 中执行此操作?

在 PostgreSQL 中,它将 SELECT FROM (VALUES (3), (4), (5)) t(id) 与带 table 的左连接相结合。但是,我没有找到 MySQL.

的替代方案

使用子查询作为内联视图,使用 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

或者依靠稳健的维度tables。

例如,用户在 favourite_fruit table 中可能有也可能没有条目,但 fruit table 可以完全填充.

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)

鉴于问题在 MariaDB 10.3 上被标记为 , note that it does support VALUES. Checked

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

在 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