我有一张包含新闻文章的表格。这些新闻文章有很多列描述标题,图片等。一些列可以具有多个值,例如类别可以设置为“体育”和“曲棍球”。
假设我有这张表:
articlekey | category
---------------------
article1 | sports, hockey
实际的表包含很多文章,所有文章只出现一次。我试图实现的是在这个表上过滤两个类别的值。为了能够做到这一点,我将它们分成行并生成一个像这样的过滤表:
articlekey | category
---------------------
article1 | sports
article1 | hockey
(顺便说一下。我们使用Tableau作为可视化/ BI工具,这就是我过滤的地方)
当我将这些连接到表格并仅在“曲棍球”上过滤(包含)时,我将得到正确的结果,因为第1条只有一行的类别设置为“曲棍球”。
articlekey | category | category-filter
-----------------------------------------------
article1 | sports, hockey | sports <-- this will be excluded
article1 | sports, hockey | hockey <-- this is included
但是,如果我试图排除“曲棍球”,那么该文章将显示“运动”类别,因为它会在“体育”类别中保留。结果我希望它完全排除文章。
articlekey | category | category-filter
-----------------------------------------------
article1 | sports, hockey | sports <-- this is included, but should also be gone
article1 | sports, hockey | hockey <-- this will be excluded
如果可能的话,当我每列有多个值并且需要过滤(包含和排除)时,我应该如何使用这样的数据,这样我每篇文章只剩下一行。
答案 0 :(得分:2)
<强>予。如果您为类别设置了“标准化”数据结构,即类别字段中没有多个值(例如“过滤表”中):
我认为解决这个问题的首选方法是将1替换为'曲棍球',将0替换为其他所有内容,然后通过articlekey将这些数字加到组中。总和为0的Articlekeys是没有“曲棍球”类别的文章。
所以这是对没有'曲棍球'类别的文章的查询:
... new MidiControlChangeMessage(0, 0, 63);
... new MidiControlChangeMessage(0, 32, 4);
... new MidiProgramChangeMessage(0, 73);
你可以概括一下:例如,如果你需要带有NEITHER'曲棍球'NOR'体育'的文章,但同时拥有“足球”和“拳击”类别:
select articlekey
from articles
group by articlekey
having sum(case when category = 'hockey' then 1 else 0 end) = 0;
但你也可以 1.过滤类别(曲棍球) 2.分组文章键 算数匹配 4.左连接
所以这是另一个解决方案:
select articlekey
from articles
group by articlekey
having sum(
case when category = 'hockey' then 1
when category = 'sports' then 1
else 0
end
) = 0
and sum(
case when category = 'soccer' then 1
when category = 'boxing' then 1
else 0
end
) = 2;
Sql fiddle:http://sqlfiddle.com/#!17/27ae1/33
<强> II。如果您对类别字段进行了非规范化,即类别列表为逗号分隔的值列表(如原始表中所示),则可以对它们使用类似%%运算符的SQL并编写如下查询:
select * from articles left join (
select articlekey, count(articlekey) as countOfHockey
from articles where category = 'hockey' group by articlekey
) hhh on articles.articlekey=hhh.articlekey where countOfHockey is null;
你也可以概括一下,如果你需要带有NEITHER'曲棍球'NOR'体育'的文章,但同时拥有“足球”和“拳击”类别:
create table if not exists articles(articlekey varchar, category varchar);
insert into articles values('article1', 'sports, hockey');
insert into articles values('article2', 'sports');
insert into articles values('article3', 'soccer, boxing, sprint');
insert into articles values('article4', 'soccer, sprint');
select * from articles where ', '||category||',' not like '%, hockey,%';
但请注意,此方法通常不是处理关系数据库中数据的首选方法。