高级(我的)SQL查询,这可能吗?

时间:2014-03-18 00:27:57

标签: php mysql sql

让我用一个例子解释整个事情:

| 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个结果。

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