2009-07-17 32 views
2

你好,我有一个表的文章和文章有一个列类别。这些类别都充满像1,4,6,8如何将逗号分隔的列表与值匹配?

如何检查是否存在具有它例如5类

我想是这样

select * from article where category in(5); 

但是产品不起作用。如果我使用像比我会例如1和10有问题。那么我怎么能在一个MySQL查询中做到这一点?

+0

什么是您的表格shcema – 2009-07-17 09:28:22

+0

是单个逗号分隔的列吗? – 2009-07-17 09:31:23

回答

3
  1. 在您需要查询的列存储CSV是一个坏主意 - 你应该使用一个单独的表。
  2. IN不是CSV的 - 它是一个单柱
  3. 这些参数预留上市值,你可以使用FIND_IN_SET()

例如:

SELECT * FROM article WHERE FIND_IN_SET('5', category) != 0; 
0

试试这个:

select * 
from article 
where category like '%,5,%' or category like '5,%' or category like '%,5' 
+0

这将匹配'1,2,3,4,5'和'10,20,30,40,50' – Greg 2009-07-17 09:31:29

2

可以做与select * from article where category='5' or category like '5,%' or category like '%,5' or category like '%,5,%'

但你真的不想这样做。

相反,你以后就是

create table article (
    id INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    headline VARCHAR(50) NOT NULL, 
    body VARCHAR(50) NOT NULL 
); 

create table articlecategory (
    article_id INTEGER NOT NULL, 
    category_id INTEGER NOT NULL, 
    PRIMARY KEY (article_id, category_id) 
); 

然后

SELECT 
    article.* 
FROM 
    article,articlecategory 
WHERE 
    articlecategory.article_id=article.id AND 
    articlecategory.category_id=5; 
0

好,这是不是最好的解决方案数据库明智的,有以逗号分隔值的列。相反,你可以有一个单独的表格和两列,一个用于类别,另一个用文章ID。 然后,你可以这样做:

select * from article, category_articles where category_article.category_id = category.id and category_article.category = 5 

Take a look at this for more on database normalization, which this is kinda related to

但是,如果不是,你可以尝试使用一个分隔符和数据存储这样一个选项:C1C10C,那么你可以使用:

select * from article where category like '%C1C%' 

哪个不会马赫10,而是会匹配1.