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

时间:2019-11-30 00:22:35

标签: mysql sql

我有两个表:

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)

1 个答案:

答案 0 :(得分:2)

如果使用字符串((SELECT idlist FROM FilterTable WHERE id =1)子查询的结果)作为IN表达式的输入,则不会获得期望的结果; MySQL将尝试将其转换为整数以匹配要测试的值(id),从而将1,21,100转换为1并仅匹配Administrator值。相反,您应该使用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

如果您的架构被正确规范化,那么您的生活会容易得多。请阅读:Is storing a delimited list in a database column really that bad?