Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 按匹配记录排序_Performance_Postgresql - Fatal编程技术网

Performance 按匹配记录排序

Performance 按匹配记录排序,performance,postgresql,Performance,Postgresql,首先,对不起,我不知道该如何命名这个问题 基本上,我正在编写一个基于位置和类别的基本搜索引擎 我有一个表events,一个表events\u categories和一个表categories。对象具有列城市和列状态 一个事件具有并属于多个类别,一个类别具有并属于多个事件 我目前有以下疑问: select * from events LEFT OUTER JOIN "events_categories" ON "events_categories"."event_id" = "events".

首先,对不起,我不知道该如何命名这个问题

基本上,我正在编写一个基于位置和类别的基本搜索引擎

我有一个表events,一个表events\u categories和一个表categories。对象具有列城市和列状态

一个事件具有并属于多个类别,一个类别具有并属于多个事件

我目前有以下疑问:

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;