Mysql查询“WHERE 2 IN(`column`)”无效

时间:2014-07-08 12:31:00

标签: php mysql sql

我想执行一个查询,我可以在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) 

5 个答案:

答案 0 :(得分:5)

这不是IN的工作方式。我不能解释为什么,只是read the docs

试试这个:

SELECT * FROM `user` WHERE FIND_IN_SET(3,`id_site`)

请注意,这需要您的数据为1,2,31,34,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)

试试这个:FIND_IN_SET(str,strlist)

答案 2 :(得分:2)

NO! 对于关系数据库

你的表格不舒服first normal form"每个属性只包含原子值,每个属性的值只包含该域中的一个值" )数据库和你:

  • 使用字符串字段包含数字
  • 在一个字段中存储多个值

要使用此类字段,您必须使用FIND_IN_SET()或存储,1,2,3,等数据(在开头和结尾注意冒号或分号或其他分隔符)并使用{{1}在每种情况下工作。这样就无法使用索引 [1] [2]

Use relation table to do this

LIKE "%,7,%"

join tables

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])