【问题标题】:Sort data set with only one of each category id仅使用每个类别 id 之一对数据集进行排序
【发布时间】:2017-12-29 17:21:00
【问题描述】:

假设我有这个数据集:

Items Category ID
1     1
2     2
3     2
4     3
5     3
6     4

现在我想对这个集合进行排序,使其每个类别只使用 1 个项目,所以我得到项目:1、2、4、6、3、5。如您所见,项目 3 和 5 放在最后,因为已经有类别 2 和 3 的项目

这是一个 MySQL 数据集,所以如果它可以与存储过程/查询一起使用,那就更好了,否则 PHP 代码没有问题。

不知道这个技术怎么称呼? 有吗?

编辑:

我知道 GROUP BY 的工作原理。但要记住。我正在对一个大型数据集进行排序,并且在此示例中使用 GROUP BY 项目 3 和 5 消失。

我想循环到所有类别,如 1、2、3、4,并从中选择第一个值,并以此为基础确定项目的顺序。当仍有项目时,循环必须运行,然后将项目 3 和 5 放在末尾。

我知道我的描述很难!对不起

【问题讨论】:

  • 能否再澄清一下您的问题?据我所知,3和5没有放在最后。 6 和 4 在最后。
  • 我想按类别 id 排序,但只使用其中一项。所以它被排序为:1,2,4,6,3。它使用类别 1 2 3 4 2 3。明白吗?
  • 一种选择是将数组转换为集合实现并对集合进行排序。 Laravel 的集合 can be installed separately 会让这变得相当简单。
  • 如果您只是像输入一样添加所需的表格格式的输出,这将有助于避免混淆。

标签: php mysql arrays sorting


【解决方案1】:

您可以使用UNION 获取所有min 项目的第一项,然后获取所有剩余的项目,例如:

SELECT MIN(Items)
FROM tablename
GROUP BY category_id

UNION

SELECT Items
FROM tablename
WHERE Items NOT IN (
   SELECT MIN(Items)
   FROM tablename
   GROUP BY category_id
)
ORDER BY category_id

【讨论】:

    【解决方案2】:

    首先,您必须根据CatergoryId 列给出行号。然后先按行号排序,再按其他列排序。

    查询

    select t.`Items`, t.`CategoryID` from(
        select `Items`, `CategoryID`,
        (
            case `CategoryID` when @curA 
            then @curRow := @curRow + 1 
            else @curRow := 1 and @curA := `CategoryID` end 
        ) as rn 
        from `your_table_name` t, 
        (select @curRow := 0, @curA := '') r 
        order by `CategoryID`, `Items`
    )t
    order by t.`rn`, t.`CategoryID`;
    

    Find demo here

    【讨论】:

    • 谢谢。这对我来说是最好的选择!非常聪明!
    【解决方案3】:

    你可以试试下面

    SELECT GROUP_CONCAT(item) AS items FROM tbl GROUP BY category_id ORDER BY item 
    

    在上面之后,你可以通过以下方式得到所需的结果

    $temp_arr = array();
    $temp = array();
    foreach($db_result as $result){
        $items = explod(',',$result);
        array_push($temp_arr,$items[0]);
        unset($items[0]);
        $temp = array_merge($temp,$items);
    }
    
    $final_array = array_merge($temp_arr,$temp);
    

    【讨论】:

      【解决方案4】:

      使用 group by 子句给出唯一的类别项目列表

      select Items,Category ID from table group by Category ID

      【讨论】:

        猜你喜欢
        • 2016-06-12
        • 2016-12-17
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-02
        相关资源
        最近更新 更多