Забыли пароль?
Запросите новый здесь.

Автор темы: grungestranger
ID темы: 2335
Информация:
Тема содержит 30 сообщения, была просмотрена 20998 раз.
Просмотр темы
PHP-Fusion Russia » Веб-разработка » MySQL
 Распечатать тему
Зад. по MySQL
Razor
Смотри я перемешиваю значения, трах тибидох, перемешал, смотри скрин..
перемешал, добавил 3 значные цифры
И ВУАЛЯ!
ВСЁ РАБОТАЕТ.
Sr. Software developer
plesk.com
 
grungestranger
Что работает то?)) выведи не больше 3 значений)
То, что ты делаешь, это, извини, полная чушь. Ты просто пытаешься подогнать что-то, чтобы что-то доказать, ты поставил group_concat_max_len = 10000 и что это значит?
 
Web
spiker
Мда.. без бутылки тут не разобраться.
grungestranger, у тебя магазин не алкогольный случайно ? ad
 
grungestranger
Razor, Без обид, просто этот способ для данной задачи не подходит.
 
Web
Razor



//Как хочешь, моё дело предложить..
//Тебе же по 2 значения надо, ну примерно предположи, сколько это максимум знаков, запили max_len = 6 знаков.
//А сортировку я сделал group_concat(distinct id ORDER BY id) таким образом, без каких либо подзапросов.
//На выходе уже обреж лишний элемент массива, это будет гораздо лучше, чем городить запрос с циклом и подзапросами, слонами и какосами..
Смотри, ща ваще офигеешь, вот тебе такое решение, здесь учтены все пожелания..
Тратата запрос
Скачать исходники  Код
SELECT type, SUBSTRING_INDEX( GROUP_CONCAT(id ORDER BY ID), ',', 2)  from test GROUP BY type ASC;



Без max_len, разбивает именно по элементам.
Вот те пруф.
Вот те крест..
s59.radikal.ru/i164/1106/63/9782167d069a.jpg
Аминь.
И самое главное что без php, консервантов и ГМО.
Изменил(а) Razor, 08.10.2014 16:41
Sr. Software developer
plesk.com
x1
 
grungestranger
Razor, надо не по 2, а по сколько угодно, и нужно не только id-шники, а строки)
 
Web
Razor
grungestranger написал:
Как сделать выборку, чтобы строк с каждым типом было, например, не больше 2 ?

Я сделал выборку, тип есть, соответствующие ему айдишники по 2 штуки есть, группировка есть. Я решил задачу.
Хотите больше, отправьте смс на короткий номер..
Sr. Software developer
plesk.com
 
grungestranger
Ну там ведь сказано - "чтобы строк с каждым типом...". А ты выбрал не строки. И там есть слово "например", которое означает, что нужно, чтобы работало для любого количества.

Объединено 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
 
Web
Razor
Поэтому у group_concat есть свой order by..
Sr. Software developer
plesk.com
 
grungestranger
Razor, ты очень любишь group_concat ))
 
Web

Поделиться этой темой
Социальные закладки: Vkontakte Odnoklassniki Mail.ru Facebook Google Tweet This
URL:
BBcode:
HTML:

Перейти на форум:
Похожие темы
Топ 5 пользователей форума
Alex Alex (1,246)   Zaxap Zaxap (1,090)   Vova Vova (877)   Pisatel Pisatel (678)   util util (666)