powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Объединить вывод по максимальному количеству
16 сообщений из 16, страница 1 из 1
Объединить вывод по максимальному количеству
    #39633466
fallmist42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем хорошего времени суток, уже которую ночь бьюсь над тайной.

Я делаю вывод SELECT username FROM profiles
Их у меня 17, условно.

Он их выводит в 17 строчек, что логично.
После объединения GROUP_CONCAT - он их выводит в одну строчку.
Как ограничить кол-во вывода. Мне нужно чтобы в одной строчке было МАКСИМУМ 5.


Взял из примера по топику

create table t1 (
pk integer primary key,
name text not null,
somedata integer null
);

insert into t1 values ( 1, "john", 5 );
insert into t1 values ( 2, "mary", 3 );
insert into t1 values ( 3, "john", 4 );
insert into t1 values ( 4, "mike", 3 );
insert into t1 values ( 5, "jake", 4 );
insert into t1 values ( 6, "max", 4 );
insert into t1 values ( 7, "jon", 4 );


И так далее

Обычным селектом ( select name from t1 )
Будет:
john
mary
john
mike
jake
max
jon


Через GROUP_CONCAT это всё будет - select group_concat('@' || + name, ' ')
@john @mary @john @mike @jake @max @jon

А как мне сделать, чтобы было ограничение по 5 в строке, то есть
@john @mary @john @mike @jake
@max @jon

То есть если меньше, то ок, если больше. чтоб переносилось на другую строчку..
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633471
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TOP 5
это делается
Но в диалектах надо уточнить.
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633472
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вру. не дочитал до конца
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633476
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fallmist42,

для начала нужно ввести в выборку поле-нумератор (или ранкатор?), которое будет делить всю выборку на части в нужное число строк. Далее - делать группировку по этому полю....

То есть, от такого вида таблицы:ID NAME1 "john"2 "mary"3 "john"4 "mike"5 "jake"6 "max"7 "jon"
Получить такую:
Rnk NAME1 "john"1 "mary"1 "john"1 "mike"1 "jake"2 "max"2 "jon"и уже по ней делать
Код: sql
1.
select group_concat .... group by Rnk
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633487
fallmist42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,

не-а, вообще не принципиально.
Просто выводить сгруппированным через конкат по 5 штук, в одной строчке.
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633493
fallmist42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Плюс, у меня нету такого поля как rank.
Если его вводить дополнительно, то тогда надо будет каждый раз его в бд прописывать, что не есть комильфо.

Можно сделать конечно супер запрос с подзапросом, чтоб он при добавлении проверял по ранку, если уже есть 5 и т.д., то идти дальше, НО
Это не будет верным решением.

Вся фишка в том, что эта выборка ещё с условиями, там потом идёт WHERE
Следовательно костыль с Rnk не будет верным.
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633570
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fallmist42,


Код: sql
1.
SELECT group_concat(name) FROM t1 group by (rowid/5)
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633571
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не на 6 делить надо


Код: sql
1.
SELECT group_concat(name) FROM t1 group by (rowid/6)
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633581
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pit_alex,

воот

Код: sql
1.
SELECT group_concat(name) FROM t1 group by ((rowid - 1)/5)
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633601
fallmist42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pit_alex,

огромнейшее спасибо, совсем забыл о присвоении rowid внутри бд.

SELECT group_concat(name) FROM t1 group by (rowid/6)

вот это правильно группирует, ровно по 5, если меньше, то оставляет сколько есть.
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633617
fallmist42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pit_alex,

SELECT group_concat(name) FROM t1 group by ((rowid - 1)/5)

Я не совсем понял, а что вот это делает:? зачем он из rowid вычитает единицу, ведь нумерация начинается с 1, или это вы убираете последнюю строчку :?
И да, почему на 6 надо в итоге, а не на 5, ведь лоджик же.
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633627
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fallmist42,

последний вариант правильный, так как если делить на 5 то в 1 строке будет 4 записи
Код: sql
1.
2.
3.
4.
5.
6.
rowid rowid/5
1       1/5 = 0
2       2/5 = 0
3       3/5 = 0
4       4/5 = 0
5       5/5 = 1 !!!!!!!!!!!!!!



а если
Код: sql
1.
(rowid - 1)/5

то

Код: sql
1.
2.
3.
4.
5.
6.
rowid rowid/5
1       0/5 = 0
2       1/5 = 0
3       2/5 = 0
4       3/5 = 0
5       4/5 = 0 
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633700
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таки нет не rowid, надо подзапрос если будут удаления в таблице то в rowid будут "дырки"


Код: sql
1.
2.
select group_concat(rowid||' '|| name)
from t1 a group by (((select count(*) from t1 b where a.pk >= b.pk) - 1)/5) 
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633739
fallmist42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pit_alex,

разве rowid - не присваиваемый номер строчки при выводы информации :?
Это же просто порядковый номер строчки именно в скуле.

Ну то есть если выводить без конката и без гроуп, то тогда, они в столбик будут, все строчки, вот им и присваивается значение rowid
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39633745
fallmist42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pit_alex,

затестил последний, с выводом rowid, так вот.
Дырки есть, но группирует всё равно правильному, если по старому.

Есть мысли в какой момент всё "пойдёт ко дну" :?
Бд пока не большая, так что не знаю.
...
Рейтинг: 0 / 0
Объединить вывод по максимальному количеству
    #39634034
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fallmist42Плюс, у меня нету такого поля как rank.
Если его вводить дополнительно, то тогда надо будет каждый раз его в бд прописывать, что не есть комильфо.
1) нет поля - сделай
2) если это надо только для одного запроса - копируй данные в дополнительную таблицу. Читай https://www.sqlite.org/lang_createtable.html про TEMP
3) Все тоже самое можно сделать и на клиенте и не издеваться над базой данных. Вытащи простой список в массив на клиенте и там склеивай в цикле - сможешь не только по количеству строк контролировать, но и по длине полученных строк.

fallmist42разве rowid - не присваиваемый номер строчки при выводы информации :?
Это же просто порядковый номер строчки именно в скуле.нет. нет. Читай документацию: https://www.sqlite.org/lang_createtable.html#rowid


fallmist42Есть мысли в какой момент всё "пойдёт ко дну" :?Когда количество "дырок" в нумерации rowid превысит терпение юзера.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Объединить вывод по максимальному количеству
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]