Просмотр темы
Страница 2 из 2: 12
|
Зад. по MySQL
|
|
Razor |
Опубликовано 08.10.2014 16:17
|
![]() Администратор ![]() Группа поддержки ![]() Сообщений: 508 Зарегистрирован: 20.08.2010 15:55 |
Смотри я перемешиваю значения, трах тибидох, перемешал, смотри скрин.. перемешал, добавил 3 значные цифры И ВУАЛЯ! ВСЁ РАБОТАЕТ. Sr. Software developer
plesk.com |
|
|
grungestranger |
Опубликовано 08.10.2014 16:20
|
![]() Пользователь ![]() Сообщений: 83 Зарегистрирован: 25.02.2013 21:52 |
Что работает то?)) выведи не больше 3 значений) То, что ты делаешь, это, извини, полная чушь. Ты просто пытаешься подогнать что-то, чтобы что-то доказать, ты поставил group_concat_max_len = 10000 и что это значит? |
|
|
spiker |
Опубликовано 08.10.2014 16:22
|
![]() Опытный пользователь ![]() Сообщений: 217 Зарегистрирован: 26.08.2010 08:49 |
Мда.. без бутылки тут не разобраться. grungestranger, у тебя магазин не алкогольный случайно ? ![]() |
|
|
grungestranger |
Опубликовано 08.10.2014 16:26
|
![]() Пользователь ![]() Сообщений: 83 Зарегистрирован: 25.02.2013 21:52 |
Razor, Без обид, просто этот способ для данной задачи не подходит.
|
|
|
Razor |
Опубликовано 08.10.2014 16:29
|
![]() Администратор ![]() Группа поддержки ![]() Сообщений: 508 Зарегистрирован: 20.08.2010 15:55 |
//Как хочешь, моё дело предложить.. //Тебе же по 2 значения надо, ну примерно предположи, сколько это максимум знаков, запили max_len = 6 знаков. //А сортировку я сделал group_concat(distinct id ORDER BY id) таким образом, без каких либо подзапросов. //На выходе уже обреж лишний элемент массива, это будет гораздо лучше, чем городить запрос с циклом и подзапросами, слонами и какосами.. Смотри, ща ваще офигеешь, вот тебе такое решение, здесь учтены все пожелания.. Тратата запрос Без max_len, разбивает именно по элементам. Вот те пруф. Вот те крест.. ![]() Аминь. И самое главное что без php, консервантов и ГМО. Изменил(а) Razor, 08.10.2014 16:41 Sr. Software developer
plesk.com |
|
|
grungestranger |
Опубликовано 08.10.2014 16:43
|
![]() Пользователь ![]() Сообщений: 83 Зарегистрирован: 25.02.2013 21:52 |
Razor, надо не по 2, а по сколько угодно, и нужно не только id-шники, а строки)
|
|
|
Razor |
Опубликовано 08.10.2014 16:46
|
![]() Администратор ![]() Группа поддержки ![]() Сообщений: 508 Зарегистрирован: 20.08.2010 15:55 |
grungestranger написал: Как сделать выборку, чтобы строк с каждым типом было, например, не больше 2 ? Я сделал выборку, тип есть, соответствующие ему айдишники по 2 штуки есть, группировка есть. Я решил задачу. Хотите больше, отправьте смс на короткий номер.. Sr. Software developer
plesk.com |
|
|
grungestranger |
Опубликовано 08.10.2014 16:50
|
![]() Пользователь ![]() Сообщений: 83 Зарегистрирован: 25.02.2013 21:52 |
Ну там ведь сказано - "чтобы строк с каждым типом...". А ты выбрал не строки. И там есть слово "например", которое означает, что нужно, чтобы работало для любого количества. Объединено 08.10.2014 19:55: Потому что нам нужно получить первые 2 строки (в нашем случае по id) для каждого типа, у тебя же выводятся не первые. Чтобы в любом случае выводились первые, нужен подзапрос, и выглядеть будет так: SET SESSION group_concat_max_len = 2; SELECT type1, group_concat(id) FROM ( SELECT t1.type AS type1, id FROM t1 ORDER BY id ) temp_table GROUP BY type1 ORDER BY type1 Небольшая поправка. Здесь используется конструкция, которая обычно используется для того, чтобы перед группировкой отсортировать строки по нужному полю, и тогда при группировке будет оставаться первая строка из каждой группы. Ну, например, нужно выбрать для каждого автора последнюю по дате статью... Так вот, раньше я всегда пользовался такой конструкцией, но она не верна, то есть она работает обычно, но так делать нельзя, потому что неизвестно в каком виде может предстать таблица для group by, оптимизатор может выкинуть сортировку, или group by будет оставлять не первую строку, или нужная строка не будет первой для него... В общем могут быть подводные камни... По сути здесь такая же ситуация, как и в случае, если мы выбираем строки из таблицы без сортировки, по идее строки будут идти в таком порядке, в каком они у нас находятся в таблице, НО это не всегда так, без указания ORDER BY mysql сортирует строки по своему принципу, который, видимо, в разных ситуациях зависит от разных вещей... Правило такое - если нет ORDER BY, то порядок не гарантирован, независимо от того откуда идет выборка И вернусь к тому, как выбрать по одной строке каждого типа, по какому-то параметру. Так нельзя: select * from ( select * from test order by pos ) as tmp group by some_type Так нужно: select * from test aa join ( select some_type, MIN(pos) AS min_pos from test group by some_type ) as bb on (bb.some_type = aa.some_type) AND (bb.min_pos = aa.pos) Изменил(а) grungestranger, 08.10.2014 19:56 |
|
|
Razor |
Опубликовано 08.10.2014 20:09
|
![]() Администратор ![]() Группа поддержки ![]() Сообщений: 508 Зарегистрирован: 20.08.2010 15:55 |
Поэтому у group_concat есть свой order by..
Sr. Software developer
plesk.com |
|
|
grungestranger |
Опубликовано 09.10.2014 07:21
|
![]() Пользователь ![]() Сообщений: 83 Зарегистрирован: 25.02.2013 21:52 |
Razor, ты очень любишь group_concat ))
|
|
Поделиться этой темой | |
Социальные закладки: |
![]() ![]() ![]() ![]() ![]() ![]() |
URL: | |
BBcode: | |
HTML: |
Страница 2 из 2: 12
Перейти на форум: |