繁体   English   中英

MySQL查询“ WHERE 2 IN(`column`)”不起作用

[英]Mysql query “WHERE 2 IN (`column`)” not working

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

那不是IN工作方式。 我不介意解释原因,只需阅读文档

尝试这个:

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;

没有! 对于关系数据库

您的表不能满足数据库的第一个范式“每个属性仅包含原子值,并且每个属性的值仅包含来自该域的单个值” ),您将:

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

要使用这样的字段,您将必须使用FIND_IN_SET()或存储数据,1,2,3, (请注意开头和结尾处的冒号,分号或其他分隔符),并使用LIKE "%,7,%"在任何情况下工作。 这样就不可能使用索引 [1] [2]

使用关系表执行此操作

CREATE TABLE user_on_sites(
    user_id INT,
    site_id INT,
    PRIMARY KEY (user_id, site_id),
    INDEX (user_id),
    INDEX (site_id)
);

加入表格

SELECT u.id, u.name, uos.site_id
FROM user_on_sites AS uos
INNER JOIN user AS u ON uos.user_id = user.id
WHERE uos.site_id = 3;

这样,您可以使用索引 有效地 进行搜索。

问题是您正在几个列表中搜索。

您需要更多类似的东西:

SELECT * FROM `user` WHERE id_site LIKE '%3%';

但是,这还将选择33、333和345,因此您需要一些更高级的文本解析。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM