首页 > 解决方案 > 如何在 PostgreSQL 中查询具有最高投票数且没有标志的值?

问题描述

我有一个类似于这样的数据库结构:

nodes
  id

properties
  id
  node_id
  name

assignments
  id
  property_id
  value

votes
  id
  assignment_id

flags
  id
  type
  assignment_id

节点是具有属性的对象。属性被分配了值,并且值被投票或标记为不正确。问题是,什么是合适的查询,它将为每个属性获取投票最多且没有标志的分配?我想我可以预先计算这个值并将其存储在属性表中active_assignment_id,如 这就是我草拟查询伪代码的方式,但我想它远非正确。

SELECT properties.name,assignments.value FROM properties
  INNER JOIN properties.id = assignments.property_id
  INNER JOIN votes.assignment_id = assignments.id
  INNER JOIN flags.assignment_id = assignments.id
  WHERE COUNT(votes) ...?
  AND COUNT(flags) = 0

如果唯一的作业没有投票,则作业应退回。投票计数是每个分配的,并且有一组属性的分配。因此,目标是找到对该属性(对于每个属性)获得最高票数的分配。

我想看看这是如何完成的,这样我就可以掌握更高级的 PostGreSQL 查询的实际用例。我以前从未在 SQL 中对这种“范围计数”做过任何事情,所以不确定从哪里开始。

标签: sqlpostgresql

解决方案


您可以尝试以下查询 -

SELECT P.name, A.value, V.CNT_VOTES total_votes
  FROM properties P
  INNER JOIN assignments A ON P.id = A.property_id
  INNER JOIN (SELECT assignment_id, COUNT(*) CNT_VOTES
                FROM votes
               GROUP BY assignment_id) V ON V.assignment_id = A.id
  LEFT JOIN flags F ON F.assignment_id = A.id
                   AND F.assignment_id IS NULL
 ORDER BY V.CNT_VOTES DESC
 LIMIT 1;

推荐阅读