让我用一个例子解释整个事情:
| id | product | rating |
1 23 54
2 23 54
3 23 53
4 24 33
5 26 22
6 24 11
假设我们对每种产品都有多个评级,并希望展示三种顶级产品。这意味着我们可以让用户Inner-/left-/right- Join
从另一个表order it by desc
获取产品名称并设置limit of 3
。但这会向我们展示三次相同的产品,评级分别为54,54和53。
是否可以通过SQL避免结果中具有相同id的产品?
因此,一个SQL查询的梦想输出将是:
| id | product | rating |
1 23 54
4 24 33
5 26 22
单词:按评级排名前三位的独特产品(当然只有评分最高的项目的行 - >产品23的ID为1或2而不是ID 3)。
此外,如果只有一种产品或两种产品具有多个评级,则只应传输1或2个结果。
答案 0 :(得分:2)
您可以通过获取每种产品的最大评级并选择前三名来完成此操作:
select product, max(rating) as maxrating
from table t
group by product
order by maxrating desc
limit 3;
如果您希望id
获得此评级,则可以使用substring_index()
/ group_concat()
技巧:
select product, max(rating) as maxrating,
substring_index(group_concat(id order by rating desc), ',', 1) as id
from table t
group by product
order by maxrating desc
limit 3;
或者,您可以避开group by
:
select t.*
from table t
where not exists (select 1
from table t2
where t2.product = t.product and
(t2.rating > t.rating or
t2.rating = t.rating and t2.id > t.id
)
)
order by t.rating desc
limit 3;
复杂的where
条款是因为多个评级可以相同。
编辑:
not exists
版本获得每行最高ID的最高评分。逻辑只是说:“从产品表中获取所有行,其中行中的产品没有其他行具有更高的评级/ ID组合”。这个是让人们理解“获得最高评级的行”的尴尬方式。但事实证明数据库更容易处理。它通常是MySQL中最有效的方法,通常也是其他数据库中最有效的方法,特别是定义了正确的索引。
答案 1 :(得分:0)
使用SELECT DISTINCT查询。在此处查看详细信息:http://dev.mysql.com/doc/refman/5.6/en/select.html