如何编写一个 MySQL 查询,该查询返回一个临时列,其中包含与该行相关的项目是不是存在于另一个表中的标志

Posted

技术标签:

【中文标题】如何编写一个 MySQL 查询,该查询返回一个临时列,其中包含与该行相关的项目是不是存在于另一个表中的标志【英文标题】:How to write a MySQL query that returns a temporary column containing flags for whether or not an item related to that row exists in another table如何编写一个 MySQL 查询,该查询返回一个临时列,其中包含与该行相关的项目是否存在于另一个表中的标志 【发布时间】:2012-02-03 19:44:29 【问题描述】:

我如何编写 mysql 查询来实现如下所示的预期结果?

我有两张桌子:

TABLE_USERS:

 ID | Name  |  ... 
--------------------
 1  | Ash   |
 2  | Tim   |
 3  | Jim   |
 4  | Jay   |
 5  | Tom   |


TABLE_FLAGS:

 ID | Reason |  ...
----------------------
 2  |  ??    |
 4  |  ...   |

我想知道如何编写一个查询以产生具有以下列的结果:

DESIRED RESULT:


 ID | Name  | Flagged
----------------------
 1  | Ash   |  false
 2  | Tim   |  true
 3  | Jim   |  false
 4  | Jay   |  true
 5  | Tom   |  false

我能做到:

SELECT TABLE_USERS.ID, TABLE_USERS.NAME
FROM TABLE_USER

要获取前两列,但我不确定如何获取最后一列...

最后一列不直接对应两个表之一中的列;相反,对于每一行,它会根据 TABLE_FLAGS 中是否存在该行 id 值的条目来返回 true 或 false

谢谢

【问题讨论】:

【参考方案1】:
   SELECT   tu.ID, 
            tu.NAME,
            CASE WHEN tf.ID IS NOT NULL THEN 'true' ELSE 'false' END AS Flagged
      FROM  TABLE_USER tu
            LEFT OUTER JOIN TABLE_FLAGS tf ON tu.ID = tf.ID

【讨论】:

除了使用 if(tf.id IS NOT NULL, 'true', 'false') 作为标记外,将提出相同的建议。不错的答案! 我会得到一个 Error Code: 1054Flagged = ... 构造。【参考方案2】:

这将显示您想要的输出:

SELECT tu.ID, tu.NAME,
       CASE WHEN tf.ID IS NOT NULL THEN 'true' ELSE 'false' END AS Flagged
  FROM TABLE_USER tu
       LEFT OUTER JOIN TABLE_FLAGS tf ON tu.ID = tf.ID ;

【讨论】:

以上是关于如何编写一个 MySQL 查询,该查询返回一个临时列,其中包含与该行相关的项目是不是存在于另一个表中的标志的主要内容,如果未能解决你的问题,请参考以下文章

MySql - 查询如何编写嵌套条件?

mysql树形结构的查询案例

SQL临时表使用

MySQL:想把查询结果作为返回值返回,这个SQL函数该怎么写?返回值类型该填啥?

MySQL5.7性能优化系列——SQL语句优化——使用物化策略优化子查询

MySQL:如何解决此查询的临时表错误?