假设我有这个数据集:
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放在最后。
我知道我的描述很难!遗憾
答案 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