如何使用另一个查询结果过滤MySQL表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用另一个查询结果过滤MySQL表相关的知识,希望对你有一定的参考价值。

我有两个表:

UserTable

id  nama
--  -------------------
1   Administrator
11  Agung
21  Sagita
50  John
100 Purnama

可过滤表

id  idlist
--  ------------------
1   1,21,100
2   21,50

所以我想从第二个表中查询带有ID的名称表

SELECT id, nama FROM UserTable
WHERE id IN (SELECT idlist FROM FilterTable WHERE id =1) 

但是在mysql中,结果仅显示

    id  nama           
------  ---------------
     1  Administrator  

虽然它应该显示UserTable中的至少3行

我认为这应该很容易,但是我已经尝试过搜索google和stackoverflow而没有解决方案,请教我如何获得所需的东西

这是一种简化,进一步的实现是为了保存访问者的搜索历史(表的ID)

答案

[如果使用字符串((SELECT idlist FROM FilterTable WHERE id =1)子查询的结果)作为IN表达式的输入,则不会获得期望的结果; MySQL将尝试将其转换为整数以匹配要测试的值(id),从而导致1,21,100被转换为1且仅与Administrator值匹配。相反,您应该使用FIND_IN_SET进行比较:

FIND_IN_SET

或(使用子查询)

SELECT u.id, u.nama
FROM UserTable u
JOIN FilterTable f ON FIND_IN_SET(u.id, f.idlist)
WHERE f.id = 1

输出:

SELECT id, nama
FROM UserTable u
WHERE FIND_IN_SET(id, (SELECT idlist FROM FilterTable WHERE id =1))

id nama 1 Administrator 21 Sagita 100 Purnama

如果您的架构被正确规范化,您的生活会容易得多。请阅读:Demo on dbfiddle

以上是关于如何使用另一个查询结果过滤MySQL表的主要内容,如果未能解决你的问题,请参考以下文章

mysql 如何把查询到的结果插入到另一个表中

MYSQL 如何把查询到的结果插入到另一个表中?

sql - 有没有办法过滤SELECT查询的结果,使用另一个SELECT查询?

MYSQL如何进行sql like (sql查询结果)的查询

mysql中如何在上一次的查询结果中再次查询

如何在查询中加入 MS-SQL 和 MySQL 表?