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

时间:2016-05-23 13:04:12

标签: mysql

我试图根据描述最独特的最高得分获得10个结果。

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

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

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

3 个答案:

答案 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列上的索引可能会有所帮助,您也可以使用以下字段创建覆盖索引:descriptiondevice_idscore,{{1} }。

如果您使用idscore作为索引中的第一列,则可能会获得更好的结果。这取决于我们不了解的数据。

请注意

  1. device_id列进行分组的速度很慢,即使使用索引
  2. 也会很慢
  3. text列上的索引几乎会使表格
  4. 的存储要求翻倍

答案 2 :(得分:-1)

我注意到不需要使用子查询

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