Performance 按匹配记录排序
首先,对不起,我不知道该如何命名这个问题 基本上,我正在编写一个基于位置和类别的基本搜索引擎 我有一个表events,一个表events\u categories和一个表categories。对象具有列城市和列状态 一个事件具有并属于多个类别,一个类别具有并属于多个事件 我目前有以下疑问:Performance 按匹配记录排序,performance,postgresql,Performance,Postgresql,首先,对不起,我不知道该如何命名这个问题 基本上,我正在编写一个基于位置和类别的基本搜索引擎 我有一个表events,一个表events\u categories和一个表categories。对象具有列城市和列状态 一个事件具有并属于多个类别,一个类别具有并属于多个事件 我目前有以下疑问: select * from events LEFT OUTER JOIN "events_categories" ON "events_categories"."event_id" = "events".
select
*
from events
LEFT OUTER JOIN "events_categories"
ON "events_categories"."event_id" = "events"."id"
LEFT OUTER JOIN "categories"
ON "categories"."id" = "events_categories"."category_id"
WHERE "categories"."id" = 2
OR "categories"."id" = 3
order by city!='Paris', state!='TX'
这是可行的,但我想根据匹配的类别数量对结果进行排序,而且我还有重复的行。我想把它们去掉
这是
预期结果应该是:
会议2
会议1
聚会4
第16次会议
会议5
第7次会议
聚会8
要按匹配类别的数量排序,可以按事件名称分组,并按计数*描述排序:
这似乎是你想要的。虽然最后两行的顺序可能不符合您的要求,但这是因为这两行的所有排序条件的值都相同:
select events.id as event_id,
events.name as event_name,
events.city,
events.state,
categories.id as category_id,
categories.name as category_name,
count(*) over (partition by events.id) as cat_count
from events
LEFT JOIN events_categories ON events_categories.event_id = events.id
LEFT JOIN categories ON categories.id = events_categories.category_id
WHERE categories.id IN (2,3)
order by city <> 'Paris',
state <> 'TX',
cat_count desc;
SQLFiddle:基于匹配的类别数-您能给我们一个您想要的输出示例吗?基于您的SQLFiddle数据集,已编辑。我还更新了SQLFiddleNitpick:Postgres允许您在orderby中使用命名列。左边的连接实际上是一个内部连接。是的,如果你按照我评论中的链接,你会看到一个fiddle示例:
select events.id as event_id,
events.name as event_name,
events.city,
events.state,
categories.id as category_id,
categories.name as category_name,
count(*) over (partition by events.id) as cat_count
from events
LEFT JOIN events_categories ON events_categories.event_id = events.id
LEFT JOIN categories ON categories.id = events_categories.category_id
WHERE categories.id IN (2,3)
order by city <> 'Paris',
state <> 'TX',
cat_count desc;