Читайте нас также в жж



Архивы


Всего постов

4388
Фотографии животных

Алтай

Томск

Фотографии природы

PHP

25.09.2013

Формулирую задачу.
Есть таблица.
В таблице в каждой строке существует идентификатор и другие параметры, которые могут быть заполнены, а могут быть не заполнены.
Задача: сделать выборку из таблицы строк группируя по идентификатору. Это конечно group и танцы вокруг него. Но задача стоит так, чтобы не просто сгруппировать, а один параметр получить всего его значения для данного идентификатора (идентификатор – мэйл, один параметр – дата), а другие параметры получить непустые, если есть. (если в одной из строк указан телефон, имя, то брать это значение).
Хочется сделать красиво и одной строчкой и сразу запросом mysql.
Решение на пол листа разумеется понятно.

 

 

 

friendlystrnger 

Sep. 25th, 2013 03:43 pm (UTC)
не совсем понятно… concat-ом слепить все поля до кучи?

можно пример? вида:
id email p1 p2 p3
1 bla1@ x y z
2 bla2@ – – c
3 bla3@ a b –
и что надо получить :)

_steppenwolf 

Sep. 25th, 2013 04:07 pm (UTC)
mail phone 1/2/2013
mail phone 2/3/2013
mail 5/6/2013

mail1 phone1 4/5/2013

надо получить:

mail phone
1/2/2013
2/3/2013
5/6/2013

mail1 phone1
4/5/2013

это логи отправки писем с телефоном для подтверждения получения итд.

friendlystrnger 

Sep. 25th, 2013 06:59 pm (UTC)
так а логи в текстовых файлах хранятся или в таблице? уже разбито по колонкам или?

муторно :) надо сначала выдрать все уникальные комбинации по mail&phone, а потом под них собрать даты…. ужос!

_steppenwolf 

Sep. 25th, 2013 07:07 pm (UTC)
таблица.
муторно, ага.
поэтому хочется как-то одной функцией это дёрнуть с таблицы.
там сначала придётся выборку по mail.
потом сравнивать все поля каждой строки на предмет заполненности.
потом собрать всё это.
А потом пройтись по датам.
и будет вторая таблица логов.
короче геморой.

 

friendlystrnger 

Sep. 25th, 2013 07:38 pm (UTC)
А если в лоб? :)
create table mail_list
select distinct `mail` from `table`;
alter table mail_list
add mail_id int unsigned auto_increment primary key first,
add `ix_mail` (mail);

create table phone_list
select mail_id, phone from `table` inner join `mail_list` on `table`.mail=`mail_list`.mail where phone<>” group by 1,2;
alter table phone_list
add phone_id int unsigned auto_increment primary key first,
add `ix_mail` (mail_id),
add `ix_phone`(phone);

create table mail_sent_log
select mail_id,phone_id,`date` from `table inner join `mail_list` on `table`.mail=`mail_list`.mail
left outer join phone_list on phone_list.phone=`table`.phone;
alter table mail_sent_log add `ix_mail_phone` (mail_id,phone_id);

Теперь в коде можно
– или полный селект (join по всем трем) запустить и отслеживать изменение mail/phone
– или во вложенном цикле – выбираем все из mail, для каждого выбираем даты в два приема:
1) select `date` from mail_sent_log where mail_id=$mail_id and phone_id is null;
2) select `phone` from phone_list where mail_id=$mail_id
– на каждый: select `date` from mail_sent_log where mail_id=$mail_id and phone_id=$phone_id

должно быстро просвистеть :)

 

_steppenwolf 

Sep. 26th, 2013 12:32 am (UTC)
Re: А если в лоб? :)
О!
Это мне надо внимательно обдумать такую методику.

 

_steppenwolf 

Sep. 28th, 2013 04:25 pm (UTC)
Re: А если в лоб? :)
да, только в лоб.
ещё хуже: там даже where (select) не сделать
  • Добавить в livejournalLivejournal
Новосибирен
  • комментариев 0
  • смотрело: 16

Comments

comments

РЕПОРТАЖИ // СТАТЬИ // НОВОСТИ
Рецензии к фильмам
Культура
Статьи, аналитика, обзоры, репортажи
Хватит кормить Москву!
Монстрации в Новосибирске
Исторические фотографии - архивы - Новосибирск
Круглые столы