仅使用每个类别ID中的一个对数据集进行排序

时间:2017-07-24 08:04:08

标签: php mysql arrays sorting

假设我有这个数据集:

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

现在我想对这个集合进行排序,使每个类别只使用1个项目,所以我得到项目:1,2,4,6,3,5。你可以看到第3项和第3项。最后放置了5个,因为已经存在类别为2和3的项目

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

我不知道这种技术是如何调用的? 任何人?

编辑:

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

我想循环到所有类别,如1,2,3,4,并从中挑出第一个值,并根据此项目的顺序。当仍有项目时,必须运行循环,然后将项目3和5放在最后。

我知道我的描述很难!遗憾

4 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

首先,您必须根据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

答案 2 :(得分:0)

您可以尝试以下

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);

答案 3 :(得分:-1)

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

select Items,Category ID from table group by Category ID