SQL在子句中用逗号分割列

时间:2015-07-28 10:50:53

标签: mysql sql select where-clause where-in

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

中显示的每个类别多次显示域

我的SQL语句是

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

这给了我以下结果

enter image description here

3 个答案:

答案 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;