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 上被标记为 mariadb, 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。
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 上被标记为 mariadb, 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。