Вот так, если вы хотите 5 рядов из вашей скрипки:
select * from
--the main data
grocery_lists gl
--joined with
inner join
--the count of items in each list
(
select list_id, group_concat(item order by item_index asc) as grouped_items, count(*) as total_count
from grocery_lists gl
group by list_id
) ct
on gl.list_id = ct.list_id
--ordered by the count of items, then the index
order by ct.total_count, ct.grouped_items, gl.item_index
Таким образом, вы получаете строки вроде:
2, orange, 0 --sorts first because count - 1
1, apple, 0 --sorts ahead of list 0 because "apple, banana" < "apple, bread"
1, banana, 1
0, apple, 0
0, bread, 1
Если элементы списка являются целыми (и вам нужно 5 строк)
Я думаю, вам нужно сделать это:
select * from
--the main data
grocery_lists gl
--joined with
inner join
--the count of items in each list
(
select list_id, group_concat(LPAD(item, 10, '0') order by item_index asc) as grouped_items, count(*) as total_count
from grocery_lists gl
group by list_id
) ct
on gl.list_id = ct.list_id
--ordered by the count of items, then by padded aggregate ints, then index
order by ct.total_count, ct.grouped_items, gl.item_index
Если ваши элементы целые, например, добавление их к ширине, например, 10, с 0 приводит к сортировке, потому что "0000000123, 00000000124" <"0000000123, 0000000125" </p>
Я выбрал 10 в ширину, потому что int max составляет 4,5 миллиарда; 10 цифр. если ваши интты будут меньше, вы можете добавить меньше
Если вы сравниваете логические значения, похожую стратегию, возможно, конвертируйте их в INT (true = 0, false = 1?), Чтобы они сортировались корректно, даже если они объединены в строку.
Если список T, T, F сортируется впереди T, F, F, тогда сделать T = 0 и F = 1 .. например
Если вы хотите 3 ряда из вашей скрипки ..
Заимствовано из тени и скорректировано на item
, являющееся целым:
select list_id, group_concat(item order by item_index asc) as items, count(*) as list_length
from yourtable
group by list_id
order by list_length asc, group_concat(LPAD(item, 8, '0') order by item_index asc) asc