2009-07-17 8 views
2

Bonjour J'ai une table avec des articles et les articles ont une catégorie de colonne. Les catégories sont remplies comme 1,4,6,8Comment puis-je faire correspondre une liste séparée par des virgules avec une valeur?

Comment puis-je vérifier s'il y a un produit qui a en elle par exemple la catégorie 5

J'ai essayé quelque chose comme

select * from article where category in(5); 

Mais ce ne fonctionne pas. Si j'utilise comme je vais avoir un problème avec par exemple 1 et 10. Alors, comment puis-je faire cela dans une requête mysql?

+0

quelle est votre table shcema –

+0

est les catégories une seule colonne séparée par des virgules? –

Répondre

3
  1. Stockage CSV dans une colonne que vous devez interroger est une mauvaise idée - vous devez utiliser une table séparée.
  2. IN est pas CSVs - il est pour la liste des valeurs pour une seule colonne
  3. Ces arguments mis à part, vous pouvez utiliser FIND_IN_SET()

Par exemple:

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

+1 pour me montrer une nouvelle fonction –

0

essayez ceci:

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

Cela correspondra à '1,2,3,4,5' et '10, 20,30,40,50 ' – Greg

+0

oups ouais gaffe :) –

+0

ont fait la correction –

2

Vous pouvez faire avec select * from article where category='5' or category like '5,%' or category like '%,5' or category like '%,5,%'

Mais vous ne voulez vraiment pas faire cela.

Au lieu de cela, ce que vous êtes après est-

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

Et puis

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

bien, ce n'est pas la meilleure base de données de solution sage, d'avoir une colonne avec des valeurs séparées par des virgules. Au lieu de cela, vous pourriez avoir une table séparée avec deux colonnes, une pour la catégorie et une avec un identifiant d'article. Ensuite, vous pouvez faire:

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

Mais si ce n'est pas une option que vous pouvez essayer d'utiliser un séparateur et stocker les données comme ceci: C1C10C, vous pouvez ensuite utiliser:

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

qui ne serait pas mach 10, mais correspondra le 1.

Questions connexes