Как я могу сопоставить разделенный запятыми список со значением? - PullRequest
2 голосов
/ 17 июля 2009

Здравствуйте, у меня есть таблица со статьями, а статьи имеют категорию столбцов. Категории заполнены как 1,4,6,8

Как я могу проверить, есть ли продукт, который имеет в нем, например, категория 5

Я пробовал что-то вроде

select * from article where category in(5); 

Но это не работает. Если я использую как, чем у меня будет проблема, например, с 1 и 10. Так как я могу сделать это в одном запросе MySQL?

Ответы [ 4 ]

3 голосов
/ 17 июля 2009
  1. Хранить CSV в столбце, который нужно запросить, - плохая идея - вам следует использовать отдельную таблицу.
  2. IN не для CSV - это для перечисления значений для одного столбца
  3. Помимо этих аргументов, вы можете использовать FIND_IN_SET()

Например:

SELECT * FROM article WHERE FIND_IN_SET('5', category) != 0;
2 голосов
/ 17 июля 2009

Вы могли бы сделать это с 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;
1 голос
/ 17 июля 2009

попробуйте это:

select *
from article
where category like '%,5,%' or category like '5,%' or category like '%,5'
0 голосов
/ 17 июля 2009

хорошо, это не самое лучшее решение для базы данных, иметь столбец со значениями, разделенными запятыми. Вместо этого вы можете иметь отдельную таблицу с двумя столбцами, один для категории и один с идентификатором статьи. Тогда вы можете сделать:

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

Взгляните на это, чтобы узнать больше о нормализации базы данных, с которой это как бы связано

Но если это не вариант, вы можете попробовать использовать разделитель и сохранить данные примерно так: C1C10C, тогда вы можете использовать:

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

, который не будет равен 10 Маха, но будет соответствовать 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...