选择一行而不是另一行,但不是基于where子句

时间:2013-08-07 19:35:39

标签: mysql

不太确定如何正确地问这个问题,这可能是我问题的一部分。存在一个具有许多类似记录的数据库,这些记录由名为' priority'的列区分。我想抓住具有更高优先级的记录,该记录具有相同的'类型' &安培; '项目' 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的项目。

3 个答案:

答案 0 :(得分:0)

Select * FROM table GROUP BY project_id, type_id ORDER BY priority DESC

答案 1 :(得分: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

答案 2 :(得分: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组合只能获得一行。