У меня снова накипело....
Работаю с mysql. И уже было полюбила и смирилась. НО...
вот пример, который меня взбесил.
смотрте
таблица тира
ID PID name
1 10 раз
2 11 два
3 11 два два
4 12 три
5 10 четыре
6 11 пять
7 12 шесть
Нужнополучить
PID name
10 раз
11 два
12 три
делаю
select distinct pid, name from table
уже поняли что не получится?
Помогите, как правильно простым запросом сделать верную выборку.
спасибо.
хайное слово в сторону мускула тоже хочется услышать

11 три
Спустя 17 минут, 29 секунд (16.04.2012 - 14:22) Nikitian написал(а):
select pid, name from test group by pid order by id
Спустя 1 минута, 44 секунды (16.04.2012 - 14:24) Placido написал(а):
SELECT `PID`, `name` FROM `таблица` GROUP BY `PID`;
Спустя 33 минуты, 59 секунд (16.04.2012 - 14:58) caballero написал(а):
olgatcpip
сформулируй задачу по человечески если хочешь чтобы тебе написали правильный запрос а не то что написали.
и при чем тут Postgresql - там то же самое будет
сформулируй задачу по человечески если хочешь чтобы тебе написали правильный запрос а не то что написали.
и при чем тут Postgresql - там то же самое будет
Спустя 20 минут, 13 секунд (16.04.2012 - 15:18) dadli написал(а):
попрубую угадать что хотел olgatcpip :)
SELECT pid,name FROM `table` WHERE id IN (
SELECT MIN(id) FROM `table` GROUP BY `pid`
)
Спустя 7 минут, 30 секунд (16.04.2012 - 15:25) olgatcpip написал(а):
Цитата |
сформулируй задачу по человечески если хочешь чтобы тебе написали правильный запрос а не то что написали. и при чем тут Postgresql - там то же самое будет |
Нужно выбрать уникальные значения PID НО вместе со строкой.
в постгресе distinct ищет уникальный и находит первый и может взять всю строку найденого элемента. и переходит к поиску следующего уникльного.
мне вот так вот и надо.
Спустя 8 минут (16.04.2012 - 15:33) dadli написал(а):
olgatcpip
Цитата |
и находит первый |
уточните етот строка "первый" по какои критерии? через аиди? или через местонахождении в таблице или как?
Спустя 2 минуты, 48 секунд (16.04.2012 - 15:36) olgatcpip написал(а):
первый попавшийся хотябы
Спустя 25 минут, 27 секунд (16.04.2012 - 16:02) caballero написал(а):
вот и привел бы запрос с прсгреса.
предполагаю в мускуле будет что то типа
предполагаю в мускуле будет что то типа
select pid,(select name from table t2 where t1.pid=t2.pid limit 1 ) as name from (select distinct pid from table) t1
Спустя 4 часа, 57 минут, 44 секунды (16.04.2012 - 20:59) waldicom написал(а):
Цитата (caballero @ 16.04.2012 - 15:02) |
вот и привел бы запрос с прсгреса. предполагаю в мускуле будет что то типа select pid,(select name from table t2 where t1.pid=t2.pid limit 1 ) as name from (select distinct pid from table) t1 |
Ольга - это девочка, одаренный ты наш.
Спустя 5 минут, 6 секунд (16.04.2012 - 21:05) caballero написал(а):
Цитата |
Ольга - это девочка, одаренный ты наш. |
Я в трусы я не заглядывал а на ники никогда внимания не обращаю. А то ночами бы не спал пытаясь расшифровать что такое waldicom и как мне в зависимости от этого написать sql запрос.
Никогда не пробовал отвечать в тему по существу? Иксперты, блин.
Спустя 10 часов, 53 минуты (17.04.2012 - 07:58) Гость_Michael написал(а):
самый первый ответ в теме как раз и рабочий.
Спустя 5 минут, 19 секунд (17.04.2012 - 08:03) glock18 написал(а):
Цитата (caballero @ 16.04.2012 - 19:05) | ||
Я в трусы я не заглядывал а на ники никогда внимания не обращаю. А то ночами бы не спал пытаясь расшифровать что такое waldicom и как мне в зависимости от этого написать sql запрос. Никогда не пробовал отвечать в тему по существу? Иксперты, блин. |
по существу было два первых поста. Остальные совсем не по делу
Спустя 4 минуты, 45 секунд (17.04.2012 - 08:08) olgatcpip написал(а):
Цитата |
select distinct pid, name from table |
Это и есть пример на постгресе :)
Ну может так ещё ..
select distinct on pid name from tableя точно не помню, опыт думаю сравнительный сделать... сообщу как сделаю.
А решение я такое решила принять.
Выбрать уникальные
select distinct pid from table
а потом в цикле пройтись и взять остальные данные, найти эту строку так сказать. Так как мне нужны были по сортировке id desc то в общем проблем не возникло.
Но разницу distinct в мускуле и повстгресе я поняла. Опыт опубликую в этой теме (как только сделаю... не скоро это будет)
Спустя 1 час, 4 минуты, 30 секунд (17.04.2012 - 09:12) caballero написал(а):
Цитата |
самый первый ответ в теме как раз и рабочий. |
не рабочий - попала бы строка номер 3
еще один иксперд
Цитата |
по существу было два первых поста. |
ТС нужны правильные ответы а не "по существу".
Цитата |
Но разницу distinct в мускуле и повстгресе я поняла. |
нет разницы в distinct - это стандартная конструкция SQL.
Тебе нужен именно distinct on - чисто посгресовская фича
Цитата |
А решение я такое решила принять. |
хочешь вытаскивать тысячи записей на клиента и ходить циклом - дело хозяйское
примерное решение я написал
- если конечно чукча читатель а не только писатель
Спустя 7 минут, 15 секунд (17.04.2012 - 09:19) glock18 написал(а):
Цитата (caballero @ 17.04.2012 - 07:12) |
не рабочий - попала бы строка номер 3 |
с какого бы интересно перепуга то? :)
ну-ка, ну-ка
select pid, name from test group by pid order by id
Спустя 2 минуты, 7 секунд (17.04.2012 - 09:22) caballero написал(а):
Цитата |
select pid, name from test group by pid order by id |
Это вообще работать не будет - где агрегация для name?
тоже в иксперды хочешь записатся?
почитай задачу внимательно. Разумеется если барышня думала одно а написала другое тогда конешно.
Спустя 24 минуты, 17 секунд (17.04.2012 - 09:46) Michael написал(а):
Цитата (caballero) |
не рабочий - попала бы строка номер 3 |
да вот и не попала бы. Думай иногда. А если не уверен - проверь на практике.
Цитата (caballero) |
еще один иксперд |
ты о чем?
Спустя 2 минуты, 28 секунд (17.04.2012 - 09:48) glock18 написал(а):
Цитата |
Это вообще работать не будет - где агрегация для name? |
прекрасно себе работает в mysql, а речь о нем. выхлоп такой же, как в приведенном Вами запросе. Мне вот интересно, вы себе эту таблицу создали и проверили, прежде чем сказать это, или как и я "на глазок" определяете. Поспорим-поспорим, не согласитесь, дак придется ведь проверять нарочно. Для чего только - мне не совсем понятно
Цитата (caballero @ 17.04.2012 - 07:22) |
тоже в иксперды хочешь записатся? |
заявки принимаешь?
Спустя 5 минут, 45 секунд (17.04.2012 - 09:54) caballero написал(а):
Народ, включите мозги
почему ВООБЩЕ возник вопрос по distinct который одинаковый и в мускуле и в посгресе?
почему ВООБЩЕ возник вопрос по distinct который одинаковый и в мускуле и в посгресе?
Цитата |
да вот и не попала бы. Думай иногда. А если не уверен - проверь на практике. |
там либо групировка по всем полям (и тогда поаадает третья строка) либо агрегация по второму столбцу (иначе выдаст ошибку)
либо distinct ON в посгресе (именно такой результат она и хочет).
Я понимаю что на курсах Попова вам такое не рассказывали но думать то никто не запрещает.
Спустя 5 минут, 4 секунды (17.04.2012 - 09:59) Michael написал(а):
Цитата (caballero @ 16.04.2012 - 16:02) |
вот и привел бы запрос с прсгреса. предполагаю в мускуле будет что то типа select pid,(select name from table t2 where t1.pid=t2.pid limit 1 ) as name from (select distinct pid from table) t1 |
Цитата (Кабылеро) |
Народ, включите мозги |
с себя начни. У нее задача и нужный ей результат. И запрос в первом ответе дает такой результат.
Спустя 6 минут, 47 секунд (17.04.2012 - 10:06) glock18 написал(а):
вот, не удержался да проверил
результат:
10 1
11 2
12 3
Не, я мозги стараюсь не выключать. caballero, давай уже прекращай воду пенить, соберись и проверь у себя
create table test (
id integer not null auto_increment,
pid integer,
name varchar(20),
primary key (id),
index (pid)
) engine=myisam default charset=utf8;
insert into test (pid, name)
values (10, '1'), (11, '2'), (11, '2 2'), (12, '3'), (10, '4'), (11, '5'), (12, '6');
select pid, name from test group by pid order by id;
результат:
10 1
11 2
12 3
Не, я мозги стараюсь не выключать. caballero, давай уже прекращай воду пенить, соберись и проверь у себя
Спустя 33 секунды (17.04.2012 - 10:06) caballero написал(а):
Цитата |
И запрос в первом ответе дает такой результат. |
хочешь сказать мускул не потребует агрегации по негруппируемому полю?
Замечательно, и какое же из двух значений name(второй или третьей строки) он выберет?
Спустя 9 минут, 27 секунд (17.04.2012 - 10:16) glock18 написал(а):
Цитата (caballero @ 17.04.2012 - 08:06) |
Замечательно, и какое же из двух значений name(второй или третьей строки) он выберет? |
первое попавшееся, что эквивалентно твоему запросу. но он, мягко говоря, немного страшен для такой простой задачи
Спустя 1 час, 3 минуты, 14 секунд (17.04.2012 - 11:19) Michael написал(а):
Цитата (glock18 @ 17.04.2012 - 10:06) |
caballero, давай уже прекращай воду пенить, соберись и проверь у себя |
сейчас окажется что у него mysql не установлен, бывали тут уже такие случаи, не ново.

Спустя 2 часа, 45 минут, 54 секунды (17.04.2012 - 14:05) Nikitian написал(а):
Цитата (caballero @ 17.04.2012 - 10:22) | ||
Это вообще работать не будет - где агрегация для name? тоже в иксперды хочешь записатся? почитай задачу внимательно. Разумеется если барышня думала одно а написала другое тогда конешно. |
Прекрасно рабоает. Не поленился, создал табличку, наполнил, проверил - всё так и есть. Барышня написала что есть и что нужно на выходе. Какая задача - такое и решение.
Спустя 1 час, 17 минут, 28 секунд (17.04.2012 - 15:22) olgatcpip написал(а):
caballero
у нашего проекта политика такая: никаких сложных запросов. простой селект самый простой... даже group by не желателен. Уж так вышло, что выгодней выбрать все и в цикле обработать...
у нашего проекта политика такая: никаких сложных запросов. простой селект самый простой... даже group by не желателен. Уж так вышло, что выгодней выбрать все и в цикле обработать...
Спустя 4 минуты, 48 секунд (17.04.2012 - 15:27) glock18 написал(а):
Цитата (olgatcpip @ 17.04.2012 - 13:22) |
у нашего проекта политика такая: никаких сложных запросов. простой селект самый простой... даже group by не желателен. Уж так вышло, что выгодней выбрать все и в цикле обработать... |
убрать order by, убедиться, что по pid есть индекс, и вперед с флагом и песней выбирать с группировкой
Спустя 2 минуты, 1 секунда (17.04.2012 - 15:29) olgatcpip написал(а):
glock18
Цитата |
вот, не удержался да проверил |
во! а теперь результат по запросу как в первом посте пожалуйста в студию
Спустя 1 минута, 37 секунд (17.04.2012 - 15:31) olgatcpip написал(а):
Цитата |
результат: 10 1 11 2 12 3 |
да. такой результат и нужен был... не догадалась бональным group by сделать


Спустя 1 минута, 33 секунды (17.04.2012 - 15:32) olgatcpip написал(а):
insert into test (pid, name)
values (10, '1'), (11, '2'), (11, '2 2'), (12, '3'), (10, '4'), (11, '5'), (12, '6');
А если добавить ещё запись (11, '2') и (11, '2 2')
group by не затупит?
Спустя 2 минуты, 1 секунда (17.04.2012 - 15:34) glock18 написал(а):
Цитата (olgatcpip @ 17.04.2012 - 13:32) |
А если добавить ещё запись (11, '2') и (11, '2 2') group by не затупит? |
почему он вдруг должен затупить?
Спустя 2 минуты, 3 секунды (17.04.2012 - 15:37) olgatcpip написал(а):
Цитата |
убрать order by, убедиться, что по pid есть индекс, и вперед с флагом и песней выбирать с группировкой |
ну.. я не берусь спорить с руководством. С такими нагрузками как там у меня опыта работа нет, даже близко, а у них есть. Прошу не судить строго, ибо не это тема сейчас.
Спустя 1 минута, 21 секунда (17.04.2012 - 15:38) olgatcpip написал(а):
Цитата |
почему он вдруг должен затупить? |
признаюсь, мне лень запускать пример сейчас... если не ответишь, не с обиде. как прижмет сразу же в эту тему гляну

Спустя 2 минуты, 46 секунд (17.04.2012 - 15:41) Гость_Michael написал(а):
Цитата (olgatcpip) |
у нашего проекта политика такая: никаких сложных запросов. простой селект самый простой... даже group by не желателен |
очень удобная политика - называется, дай угадаю, - "чтобы всем все было понятно" ?

Спустя 9 минут, 32 секунды (17.04.2012 - 15:50) glock18 написал(а):
Цитата (olgatcpip @ 17.04.2012 - 13:37) |
С такими нагрузками как там у меня опыта работа нет |
а, "тупить" вот о чем. Вообще может я поторопился насчет флага и песен, индекс бесполезен здесь.
альтернативы
1.
select distinct pid from test;
select pid, name from test where pid in (10, 11, 12);
минус в том, второй запрос вернет все строки из таблицы. если большая, то это тоже будет плохо
2. оба решения примерно одинаковы по логике:
что предложил caballero или
select distinct pid from test;
для каждого полученного pid еще по селекту с лимитом
опять же, если pid различных будет много, то тоже решение не очень
Вообще хорошего че-то не приходит в голову
Спустя 3 минуты, 25 секунд (17.04.2012 - 15:54) glock18 написал(а):
olgatcpip
сколько будет записей в таблице известно? ограничено чем-то или нет
сколько будет записей в таблице известно? ограничено чем-то или нет
Спустя 10 часов, 54 минуты, 40 секунд (18.04.2012 - 02:48) olgatcpip написал(а):
Цитата |
сколько будет записей в таблице известно? ограничено чем-то или нет |
ну.. limit есть конечно. И эти элементы выводятся в пейдженге, так что вот.
Спустя 2 часа, 39 минут, 53 секунды (18.04.2012 - 05:28) glock18 написал(а):
Цитата (olgatcpip @ 18.04.2012 - 00:48) |
ну.. limit есть конечно. И эти элементы выводятся в пейдженге, так что вот. |
я не о выводе, хотя это тоже может оказаться полезным.
1. Сколько всего строк в таблице?
2. Сколько в среднем строк с равными pid?
Спустя 2 часа, 39 минут, 28 секунд (18.04.2012 - 08:08) olgatcpip написал(а):
glock18
скажем так, мной показана придуманная таблица - в реальности это письма-сообщения аккаунтов проекта
скажем так, мной показана придуманная таблица - в реальности это письма-сообщения аккаунтов проекта
Спустя 25 минут, 51 секунда (18.04.2012 - 08:33) glock18 написал(а):
Цитата (olgatcpip @ 18.04.2012 - 06:08) |
скажем так, мной показана придуманная таблица - в реальности это письма-сообщения аккаунтов проекта |
запрос, получается, должен выбрать по одному сообщению от каждого/каждому пользователя(ю)?
Спустя 6 часов, 42 минуты, 5 секунд (18.04.2012 - 15:16) olgatcpip написал(а):
угу. вместе с самим текстом сообщения.
при этом на каждое сообщение 2 записи: мне письмо и тебе письмо. вот так вот.
т.е. вывести последнее сообщение с собеседником. и не важно я отправила письмо или мне
при этом на каждое сообщение 2 записи: мне письмо и тебе письмо. вот так вот.
т.е. вывести последнее сообщение с собеседником. и не важно я отправила письмо или мне
_____________
Ласковое слово и кошке приятно... Плюсик в карму сойдет wink.gif
*smarty дока - новая любовь
Моё рукотворение ругайте, хвалите smile.gif
Веду маленький блог
в этом блоге публикую новые работы
WMR217126627282 wink.gif