我想执行一个查询,我可以在ID列表中找到一个ID。
表user
id_user | name | id_site
-------------------------
1 | james | 1, 2, 3
1 | brad | 1, 3
1 | suko | 4, 5
和我的查询(不起作用)
SELECT * FROM `user` WHERE 3 IN (`id_site`)
此查询工作(但没有完成工作)
SELECT * FROM `user` WHERE 3 IN (1, 2, 3, 4, 6)
答案 0 :(得分:5)
这不是IN
的工作方式。我不能解释为什么,只是read the docs
试试这个:
SELECT * FROM `user` WHERE FIND_IN_SET(3,`id_site`)
请注意,这需要您的数据为1,2,3
,1,3
和4,5
(即无空格)。如果这不是一个选项,请尝试:
SELECT * FROM `user` WHERE FIND_IN_SET(3,REPLACE(`id_site`,' ',''))
或者,考虑重组数据库。即:
CREATE TABLE `user_site_links` (
`id_user` INT UNSIGNED NOT NULL,
`id_site` INT UNSIGNED NOT NULL,
PRIMARY KEY (`user_id`,`site_id`)
);
INSERT INTO `user_site_links` VALUES
(1,1), (1,2), (1,3),
(2,1), (2,3),
(3,4), (3,5);
SELECT * FROM `user` JOIN `user_site_links` USING (`id_user`) WHERE `id_site` = 3;
答案 1 :(得分:2)
答案 2 :(得分:2)
NO! 对于关系数据库
你的表格不舒服first normal form("每个属性只包含原子值,每个属性的值只包含该域中的一个值" )数据库和你:
要使用此类字段,您必须使用FIND_IN_SET()
或存储,1,2,3,
等数据(在开头和结尾注意冒号或分号或其他分隔符)并使用{{1}在每种情况下工作。这样就无法使用索引 [1] [2] 。
Use relation table to do this:
LIKE "%,7,%"
CREATE TABLE user_on_sites(
user_id INT,
site_id INT,
PRIMARY KEY (user_id, site_id),
INDEX (user_id),
INDEX (site_id)
);
这样您就可以搜索efficiently using indexes。
答案 3 :(得分:0)
问题是你在几个列表中搜索。
你需要更像的东西:
SELECT * FROM `user` WHERE id_site LIKE '%3%';
但是,这也将选择33,333和345,因此您需要一些更高级的文本解析。
答案 4 :(得分:0)
WHERE IN子句可用于替换许多OR条件。 例如
SELECT * FROM `user` WHERE id IN (1,2,3,4)
比
更清洁SELECT * FROM `user` WHERE id=1 OR id=2 OR id=3 OR id=4
你只是想以错误的方式使用它。
正确的方式:
WHERE `field` IN (list_item1, list_item2 [, list_itemX])