SQL 在 where 子句中用逗号分隔列

SQL split column by comma in where clause

我正在尝试显示记录有多个类别的位置,但我的查询似乎只显示第一个实例。我需要查询多次显示它出现在

中的每个类别的域

我的SQL声明是

SELECT domains.*, category.* 
FROM domains,category 
WHERE category.id IN (domains.category_id)

这给了我以下结果

您不应在字符串中存储数值。坏,坏主意。您应该使用正确的连接 table 和正确的 SQL 结构。

有时,我们会被其他人糟糕的设计决定所困。 MySQL 提议 find_in_set() 在这种情况下提供帮助:

where find_in_set(category.id, domains.category_id) > 0

使用find_in_set()。

SELECT domains.*, category.* 
FROM domains,category 
WHERE find_in_set (category.id ,domains.category_id)

但是将fk存储为csv是非常糟糕的数据库设计。

正如其他人所指出的,您可以使用 FIND_NI_SET() 作为解决问题的变通方法。

我的建议是重构一下代码和数据库。将 CSV 格式的值存储在单个列中几乎总是一个坏主意。 正如 Gordon Linoff 正确指出的那样,如果您创建一个额外的 table 来存储 category_id 值,您会过得更好:

CREATE TABLE domain_categories (domain_id INT, category_id INT, PRIMARY KEY (domain_id, category_id));

这是假设您要强制每个类别针对每个域只存储一次。如果不这样做,只需删除主键。

然后您将您的 ID 插入这个新的 table:

INSERT INTO domain_categories (domain_id, category_id) VALUES (2,6),(2,8);

INSERT INTO domain_categories (domain_id, category_id) VALUES (4,3);
INSERT INTO domain_categories (domain_id, category_id) VALUES (4,11);
INSERT INTO domain_categories (domain_id, category_id) VALUES (20,3);

现在您已经正确存储了数据,您可以根据需要轻松查询:

SELECT domains.*,category,*
 FROM domains
  JOIN domain_category ON (domain_category.domain_id=domains.id)
  JOIN category ON (category.id=domain_category.category_id);

使用 MySQL 怪癖,您甚至可以以 CSV 格式显示 category_id 列。

SELECT domains.*, GROUP_CONCAT(DISTINCT domain_category.category_id)
 FROM domains
  JOIN domain_category ON (domain_category.domain_id=domains.id)
 GROUP BY domains.id;