我试图根据描述最独特的最高得分获得10个结果。
因此,这10个结果不应包含具有相同描述的记录。
需要修改以在列description
中返回唯一值的查询
选择所有字段:
`SELECT * FROM datafeeds
WHERE device_id = 1
ORDER BY score
LIMIT 10;`
答案 0 :(得分:0)
添加主键并按顺序排序。这真的有帮助。
答案 1 :(得分:0)
让我们一步一步地做:
首先使用表格中的ID获取您感兴趣的描述列表:
SELECT
MAX(score) as max_score,
MAX(id) as last_id,
description
FROM
datafeeds
WHERE
device_id = 1
GROUP BY
description
ORDER BY
MAX(score) DESC
LIMIT 10;
现在,您有一个描述列表,让我们抓住它们的所有列:
SELECT
*
FROM
datafeeds
WHERE
id IN (
SELECT
MAX(id) as last_id
FROM
datafeeds
WHERE
device_id = 1
GROUP BY
description
ORDER BY
MAX(score) DESC
LIMIT 10
);
上述查询可能会给您一个错误,指出不支持LIMIT
...
这样的黑客可能有所帮助:
SELECT
*
FROM
datafeeds
WHERE
id IN (
SELECT last_id FROM (
SELECT
MAX(id) as last_id
FROM
datafeeds
WHERE
device_id = 1
GROUP BY
description
ORDER BY
MAX(score) DESC
LIMIT 10
) AS X
);
或加入子查询
SELECT
*
FROM
(
SELECT last_id FROM (
SELECT
MAX(id) as last_id
FROM
datafeeds
WHERE
device_id = 1
GROUP BY
description
ORDER BY
MAX(score) DESC
LIMIT 10
) X
INNER JOIN datafeeds DF
ON X.last_id = DF.id
;
description
列上的索引可能会有所帮助,您也可以使用以下字段创建覆盖索引:description
,device_id
,score
,{{1} }。
如果您使用id
或score
作为索引中的第一列,则可能会获得更好的结果。这取决于我们不了解的数据。
请注意
device_id
列进行分组的速度很慢,即使使用索引text
列上的索引几乎会使表格答案 2 :(得分:-1)
我注意到不需要使用子查询
SELECT * FROM `datafeeds`
WHERE `device_id` = 1
GROUP BY `description
ORDER BY `score`
LIMIT 10';