我正在尝试显示记录有多个类别的位置,但我的查询似乎只显示第一个实例。我需要查询为
中显示的每个类别多次显示域我的SQL语句是
SELECT domains.*, category.*
FROM domains,category
WHERE category.id IN (domains.category_id)
这给了我以下结果
答案 0 :(得分:2)
您不应将数值存储在字符串中。糟糕,糟糕的主意。您应该使用正确的联结表和正确的SQL结构。
有时,我们会遇到其他人糟糕的设计决定。 MySQL提供<div id="formContainer" class="border-box">
<div class="group-box">
<p>Fields marked with <span class="required">*</span> are required to complete the form</p>
</div>
<div class="group-box">
<h2>Partial element test</h2>
<div class="form-container">
{{>partials.inputNarrow}} <-- I have to be able to specify what data I want to enter here.
</div>
<div class="form-container">
{{>partials.selectNarrow}} <-- I have to be able to specify what data I want to enter here.
</div>
</div>
来帮助解决这种情况:
find_in_set()
答案 1 :(得分:2)
使用find_in_set()。
SELECT domains.*, category.*
FROM domains,category
WHERE find_in_set (category.id ,domains.category_id)
但将fk存储为csv是非常糟糕的数据库设计。
答案 2 :(得分:0)
正如其他人所指出的,您可以使用FIND_NI_SET()
作为解决方法来解决您的问题。
我的建议是你重构一下你的代码和数据库。以CSV格式存储存储在单个列中的值几乎总是一个坏主意。
正如Gordon Linoff正确地指出,如果你创建一个额外的表来存储category_id
值,那么你会更好:
CREATE TABLE domain_categories (domain_id INT, category_id INT, PRIMARY KEY (domain_id, category_id));
假设您希望每个类别仅针对每个域存储一次。如果您不这样做,只需删除主键即可。
然后您将ID插入此新表:
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;