【问题标题】:Joining pre-defined, possibly non-existing keys with table data将预定义的、可能不存在的键与表数据连接起来
【发布时间】:2017-01-09 16:45:33
【问题描述】:

在 MySQL(或一般的 SQL)中,是否可以生成一个预定义标识符列表,并与匹配的表数据连接?

以下表数据为例,我们称之为my_table

id | value
---+------
 1 | 'a'
 3 | 'c'

现在,我有一个可能的id 值列表,并希望获得这些值的完整列表,以及上表中的连接数据。使用列表[1, 2, 3, 4],期望的结果是:

item | id   | value
-----+------+------
   1 |  1   | 'a'
   2 | NULL | NULL
   3 |  3   | 'c'
   4 | NULL | NULL

显然,像SELECT * FROM my_table WHERE id IN (1, 2, 3, 4) 这样的查询只产生两行的结果(值“a”和“c”)。

对于解决方案,我正在考虑某种形式的临时表,提供完整的 id 列表 ([1, 2, 3, 4]),然后将其与表数据连接起来,例如

SELECT t1.`item`, t2.`id`, t2.`value`
FROM
   ...
AS t1
LEFT JOIN `my_table` AS t2 ON t2.`id` = t1.`item`

但是我该怎么做呢?

这甚至可能吗?还是真的有必要将结果与外部代码中的初始列表进行比较? (这是可能的,但在我的情况下并非微不足道,标识符不是整数)

(最终的想法是,我想从数据库中得到一个包含所有输入 id 的结果集,以便我可以轻松识别不存在的记录)


更新:我想这归结为一个问题:我怎样才能得到一个结果集,例如

id
---
 1
 2
 3
 4

来自(My)SQL 服务器没有将其作为某个表中的数据,而是通过在某些查询中设置数据?

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    我的脑海中闪现出一种新方法...使用union

    SELECT t1.`item`, t2.`id`, t2.`value`
    FROM (
        select 1 as `item`
        union select 2
        union select 3
        union select 4
        ) AS t1
    LEFT JOIN `my_table` AS t2 ON t2.`id` = t1.`item`
    

    它回答了这个问题,但这是否是“最佳”答案还有待观察。只要items 的列表不太长(我就是这种情况),它就可以工作。

    谁有更好的解决方案?

    【讨论】:

      猜你喜欢
      • 2017-03-13
      • 1970-01-01
      • 2012-11-10
      • 2022-12-12
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多