如何将逗号分隔列表与值匹配?

时间:2009-07-17 09:24:48

标签: sql mysql data-structures

你好,我有一个包含文章的表,文章有一个列类别。类别填写如1,4,6,8

如何检查是否有产品,例如类别5

我试过像

这样的东西
select * from article where category in(5); 

但这不起作用。如果我使用喜欢,那么我将遇到例如1和10的问题。那么如何在一个mysql查询中执行此操作?

4 个答案:

答案 0 :(得分:3)

  1. 将CSV存储在您需要查询的列中是一个坏主意 - 您应该使用单独的表。
  2. IN不适用于CSV - 用于列出单个列的值
  3. 除了这些论点,您可以使用FIND_IN_SET()
  4. 例如:

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

答案 1 :(得分: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;

答案 2 :(得分:1)

试试这个:

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

答案 3 :(得分: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。