我有两个表:
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)
答案 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
如果您的架构被正确规范化,那么您的生活会容易得多。请阅读:Is storing a delimited list in a database column really that bad?