0

不太清楚如何正确地问这个问题,这可能是我的问题的一部分。存在一个包含许多类似记录的数据库,这些记录由一个称为“优先级”的列来区分。我想获取具有相同“类型”和“项目”ID 的具有更高优先级的记录。例如,该表如下所示:

id  project_id type_id  priority 
1   66          14      0
2   66          14      10
3   66          16      0

目前程序选择通过项目和类型:

Select * FROM table WHERE project_id = 66;

然后它循环遍历结果并在存在多个相同记录时丢弃较低优先级的记录type_id。有没有办法通过选择来做到这一点?

理想的结果集是:

id  project_id type_id  priority 
2   66          14      10
3   66          16      0

它丢弃了较低优先级的 type_id 14 记录。表中可能有超过 2 个具有相同 type_id 的项目。

4

3 回答 3

0
Select * FROM table GROUP BY project_id, type_id ORDER BY priority DESC
于 2013-08-07T19:40:31.003 回答
0
SELECT *
FROM table
JOIN (
    SELECT project_id, type_id, MAX(priority) AS max_priority
    FROM table
    GROUP BY project_id, type_id
) AS maxima -- subquery returns one row per group (project_id, type_id) along with the highest priority in each group 
-- join this with the main table
ON maxima.project_id = table.project_id
AND maxima.type_id = table.type_id
AND maxima.max_priority = table.priority
于 2013-08-07T19:40:44.743 回答
0

唯一难以获得的领域是id. 而且,您可以使用一个group_concat()技巧来获得它。

select project_id, type_id, max(priority) as priority,
       substring_index(group_concat(id order by priority desc), ',', 1) as id
from t
group by project_id, type_id;

这将确保您获得最大的 id,并且您只能为每个project_id/type_id组合获得一个这样的行。

于 2013-08-07T19:56:52.813 回答