Mysql 如何从返回所有字段的1个字段中获取唯一值

Mysql 如何从返回所有字段的1个字段中获取唯一值,mysql,Mysql,我试图得到10个结果的基础上,最高分数的描述是唯一的 因此,这10个结果不应包含具有相同描述的记录 需要修改以在列描述中返回唯一值的查询 选择所有字段: `SELECT * FROM datafeeds WHERE device_id = 1 ORDER BY score LIMIT 10;` 我注意到没有必要使用子查询 SELECT * FROM `datafeeds` WHERE `device_id` = 1 GROUP BY `description ORDER BY `sc

我试图得到10个结果的基础上,最高分数的描述是唯一的

因此,这10个结果不应包含具有相同描述的记录

需要修改以在列描述中返回唯一值的查询 选择所有字段:

`SELECT * FROM datafeeds 
WHERE device_id = 1 
ORDER BY score 
LIMIT 10;`

我注意到没有必要使用子查询

SELECT * FROM `datafeeds` 
WHERE `device_id` = 1
 GROUP BY `description
ORDER BY `score` 
LIMIT 10';

添加主键并按其排序。这真的很有帮助。

让我们一步一步来:

首先从表中获取您感兴趣的描述列表,并使用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
);
上面的查询可能会给您一个错误,说明不支持限制

这样的黑客可能会有所帮助:

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
;
描述列上的索引可能会有所帮助,或者您可以使用以下字段创建覆盖索引:描述、设备id、分数、id

如果将分数或设备id用作索引的第一列,则可能会获得更好的结果。这取决于我们不知道的数据

请注意

在文本列上分组很慢,即使使用索引也会很慢 文本列上的索引将使表的存储需求几乎增加一倍
拉威尔在这里重要吗?您的查询目标是什么?你目前的索引是什么?您的查询速度很慢,因为第二个条件没有意义,但MySQL很乐意为您计算。好的,它基本上过滤掉了所有的空值,但是NULL/IS NOT NULL不是更好的方法吗?目前没有索引,我正在添加它们。第二个条件用于仅从描述字段返回唯一值。在SelectDescriptionfromDataFeedsGroupbyDescription中使用GROUP BY description而不是AND description时,速度非常慢。好的,但问题是什么。这个查询应该解决什么问题?您向我们发送了一个查询,其中没有关于环境及其目标的任何信息。表现出一些努力,描述你的问题不,查询速度慢不是你的根本问题。为什么你认为任何索引都可以解决任何与速度相关的问题?在某些情况下,它们会减慢查询速度。退一步,重新表述你的问题,给我们一个恰当的问题。标记为“不清楚您在问什么”。@pred如上所述,我试图根据描述唯一的最高分数获得10个结果,但我的查询速度非常慢,因此我搜索了如何加快查询速度并找到了索引,因此我询问了如何为该查询编制索引。这对你来说清楚了吗?“独特”是什么意思?只有一行有这样的描述?如果有两行或更多行具有相同的描述,该怎么办?子查询用于从描述列获取唯一值。我认为这就是解决方法?这会为非聚合列生成不确定的结果我知道这个查询有什么问题@strawberry@Assen:查询的问题是OP无法描述他们的问题,因此您的查询和所有答案都只是猜测。只搜索XY问题。@Pred我注意到他使用的是子查询,它没有用,会降低性能……所以,这将是他的问题的答案。MySQL中没有这样的东西。查询中不能设置主键的顺序,但未实现->无效。