另一个按 MySQL 查询顺序排列的组

Posted

技术标签:

【中文标题】另一个按 MySQL 查询顺序排列的组【英文标题】:Another Group by Order By MySQL Query 【发布时间】:2013-07-27 13:35:27 【问题描述】:

我知道这已经被打败了 - 但我还没有看到一个真正有效的好答案。这是我的情况:我有以下查询:

SELECT items.item_name, sort_order as total_count, user_top_favorites.item_id.item_id
        FROM user_top_favorites
        INNER JOIN items ON user_top_favorites.item_id = items.item_id
        WHERE user_top_favorites.user_id = 1
        GROUP by user_top_favorites.item_id.item_id
        ORDER BY sort_order asc
        LIMIT 0 , 6

我尝试了以下指数:

user_sort (user_id, item_id, sort_order)
user_sort (item_id, user_id, sort_order)
user_sort (user_id, sort_order, item_id)

我总是得到:Using temporary; Using filesort

这里的正确索引是什么以避免临时和文件排序?

更新: user_sort 只是我创建的索引的名称,该索引属于user_top_favorites 表。

【问题讨论】:

查询在limit和group by之前生成了多少行? 如果没有任何聚合函数,为什么还要使用组? 为什么user_sort 上的索引会对不使用该表的查询产生影响? @GordonLinoff 这只是我标准的索引名称。 索引在哪个表上?您应该编辑问题以更正索引并解决其他 cmets。 【参考方案1】:

如果user_top_favoritesuser_id, sort_orderitemsitem_id)中没有重复项,我认为您可以消除 group by。您也可以选择前 6在join 之前。虽然这实现了一个表,但它太小了,不会影响性能。

    SELECT i.item_name, utf.sort_order as total_count, utf.item_id.item_id
    FROM (select utf.*
          from user_top_favorites utf
          where utf.user_id = 1
          order by utf.sort_order
          limit 6
         ) utf join
         items i
         ON utf.item_id = i.item_id
    ORDER BY utf.sort_order asc;

如果您需要此查询,那么以下索引应该有助于提高性能:user_top_favorites(user_id, sort_order)items(item_id)

如果你想冒险一点,你可以消除外部order bymysql 不保证子查询的顺序,但我想你会在实践中按照你想要的顺序得到它们。但是,对 6 条记录进行排序确实需要很短的时间。

【讨论】:

以上是关于另一个按 MySQL 查询顺序排列的组的主要内容,如果未能解决你的问题,请参考以下文章

使用 mySQL 按字母顺序排列美国各州

MYSQL 按顺序排列

Mysql中ORDER BY 排序怎么使用?指定顺序和多字段排列

按字母顺序排列的数据透视表

检查一个字符串的字母在另一个字符串中是不是按顺序排列

sql in怎么根据in的顺序排列查询结果