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;
我正在尝试显示记录有多个类别的位置,但我的查询似乎只显示第一个实例。我需要查询多次显示它出现在
中的每个类别的域我的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;