Задавайте вопросы, мы ответим
Вы не зашли.
Есть запрос:
SELECT intranet_clients.*, intranet_clients_acts.file_id, intranet_clients_acts.title, intranet_clients_hystory.date_of_event, intranet_clients_hystory.type_of_event, intranet_clients_hystory.description_of_event, intranet_clients_phones.phone_number, intranet_clients_services.* FROM intranet_clients LEFT JOIN intranet_clients_acts ON (intranet_clients_acts.client_id = intranet_clients.id) LEFT JOIN intranet_clients_hystory ON (intranet_clients_hystory.client_id = intranet_clients.id) LEFT JOIN intranet_clients_phones ON (intranet_clients_phones.client_id = intranet_clients.id) LEFT JOIN intranet_clients_services ON (intranet_clients_services.client_id = intranet_clients.id) WHERE intranet_clients.id = 1 GROUP BY intranet_clients_services.service_title, intranet_clients_phones.phone_number
На выходе у меня вот что:
"id";"first_date";"last_date";"company";"site_url";"contact_face";"contact_face_post";"email_addr";"next_date";"manager_id";"status";"file_id";"title";"date_of_event";"type_of_event";"description_of_event";"phone_number";"id";"client_id";"service_title";"service_description" 1;"2008-08-05";"2008-08-05";"Test company";"no";"Nikolay";"Webmaster";"mail@test.ru";"2008-08-05";1;"W";1;"test1";"2008-08-05";"test event";"just test event";"233-43";1;1;"serv1";"serv1dsk" 1;"2008-08-05";"2008-08-05";"Test company";"no";"Nikolay";"Webmaster";"mail@test.ru";"2008-08-05";1;"W";1;"test1";"2008-08-05";"test event";"just test event";"233-43";2;1;"serv2";"serv2dsk" 1;"2008-08-05";"2008-08-05";"Test company";"no";"Nikolay";"Webmaster";"mail@test.ru";"2008-08-05";1;"W";1;"test1";"2008-08-05";"test event";"just test event";"322-34";1;1;"serv1";"serv1dsk" 1;"2008-08-05";"2008-08-05";"Test company";"no";"Nikolay";"Webmaster";"mail@test.ru";"2008-08-05";1;"W";1;"test1";"2008-08-05";"test event";"just test event";"322-34";2;1;"serv2";"serv2dsk"
И вот соответственно мой вопрос. Как сделать так, чтобы не повторялись значения... Перерыл весь свой мозг. Результат нулевой. По-хорошему должно получится 2 столбца. А вот как этого добиться - незнаю.
Надеюсь и уповаю на вашу помощь и поддержку.
P.S. - забыл указать детали... В двух таблицах (intranet_clients_phones и intranet_clients_services) может быть любое значение строк принадлежащих для определенного клиента. Вопрос в том, как их сгруппировать так, чтоб выводились уникальные столбцы без повторов.
P.S.2. - я, в принципе понимаю, что в этом случае данные таблицы лучше обработать отдельным запросом. Но, я хочу сделать это одним. Вопрос лишь в том,- КАК?
заранее премного благодарен.
Отредактированно wtoporman (19.06.2008 17:24:57)
Неактивен
По-хорошему должно получится 2 столбца.
Ну вы ж сами перечислили после SELECT кучу столбцов которые хотите, включая ВСЕ столбцы из двух таблиц.
Что то не сходится
Неактивен
Вообще я так подозреваю, что Вам нужно просто
По-хорошему должно получится 2 столбца
может быть любое значение строк принадлежащих для определенного клиента. Вопрос в том, как их сгруппировать так, чтоб выводились уникальные столбцы без повторов.
Видимо, Вы имели в виду уникальные строки, а не столбцы (чтобы вывести два столбца, надо в запросе их и указать).
Каков критерий группировки и какая нужна информация для каждой уникальной записи?
Неактивен
В общем, на самом деле, мне нужны именно уникальные строки.. Дело в том, что в таблицах с телефонами и сервисами есть несколько записей для каждого клиента. надо выбрать так, чтобы в конечном итоге записи в строках не повторялись.... В принципе, телефоны и сервисы я уже выбираю отдельными запросами. Просто интересно, возможно ли оптимизировать все в один запрос или нет?? Большое спасибо за помощь......
Неактивен
В вашем резльтате и есть четыре уникальных строки. Если отсеить ненужный мусор, то останется вот это:
1;"233-43";"serv1" 1;"233-43";"serv2" 1;"322-34";"serv1" 1;"322-34";"serv2"
т.е. четыре уникальных комбинации значений, именно по ним вы и группируете. Если это не то, что вы хотели - то объясните, что в вашем понимании "уникальные строки".
Просто возьмите и нарисуйте на бумаге ту таблицу, которая по вашему должна получится, думаю сразу вопросы отпадут.
Неактивен
Shopen написал:
В вашем резльтате и есть четыре уникальных строки. Если отсеить ненужный мусор, то останется вот это:
Код:
1;"233-43";"serv1" 1;"233-43";"serv2" 1;"322-34";"serv1" 1;"322-34";"serv2"т.е. четыре уникальных комбинации значений, именно по ним вы и группируете. Если это не то, что вы хотели - то объясните, что в вашем понимании "уникальные строки".
Просто возьмите и нарисуйте на бумаге ту таблицу, которая по вашему должна получится, думаю сразу вопросы отпадут.
Большое спасибо за совет..... Дело в том, что я просто не учел, что строки получаются уникальные.... Но вот отсюда уже встречный вопрос. Как сделать так, чтобы посредством того же запроса получилось не:
1;"233-43";"serv1" 1;"233-43";"serv2" 1;"322-34";"serv1" 1;"322-34";"serv2"
а:
1;"233-43";"serv1" 1;"322-34";"serv2"
вот это, в принципе я и имел в виду....
Заранее спасибо....
Неактивен
Эээ... а какой логикой Вы руводствуетесь при выборе строк? Чем такая комбинация
строк лучше, чем, скажем,
1;"233-43";"serv2"
1;"322-34";"serv1"
Неактивен
paulus написал:
Эээ... а какой логикой Вы руводствуетесь при выборе строк? Чем такая комбинация
строк лучше, чем, скажем,
1;"233-43";"serv2"
1;"322-34";"serv1"
Дело вовсе не в комбинации строк, необходимо просто сделать чтобы одинаковые номера телефонов так же как и одинаковые сервисы не отображались.
Неактивен
Мои две строки удовлетворяют этим требованиям. При этом они не совпадают
с Вашими. Какой критерий выбора?
Неактивен
paulus написал:
Мои две строки удовлетворяют этим требованиям. При этом они не совпадают
с Вашими. Какой критерий выбора?
Вот что получается при выборке:
1;"233-43";"serv1" 1;"233-43";"serv2" 1;"322-34";"serv1" 1;"322-34";"serv2"
как видно из примера, получается 4 строки 2 строки с телефоном 233-43 и 2 строки с телефоном 322-34, соответственно, как видно опять же из примера, номера телефонов повторяются. В базе, 2 номера! всего! а тут он выводит 4! по 2 раза каждый... На сколько я понимаю, всё это из-за сервисов (serv1, serv2), которые тоже повторяются 2 раза. Мне надо, чтобы не было повторений. В общем.... чесслово.... незнаю, как можно сделать запрос так, чтоб не было повторного вывода данных...
P.S. - в базе 2 сервиса и 2 номера телефона.... На выходе они не должны дублироваться. Как можно их сгруппировать???
Неактивен
никак этого не сделать в ОДНОЙ таблице.
Вы не сделали самого главного - не нарисовали таблицу на бумаге.
Вы можете сгруппировать по телефонам - у вас получится две строки
Вы можете сгруппировать по сервисам - у вас тоже получится две строки
но если вы группируете и по тому и по тому, а связи между телефонами и сервисами нет (уникальность телефонов не параллельна уникальности сервисов, т.е. каждому сервису не противопоставлен конкретный телефон), то у вас всегда получится таблица с количеством строк равным произведению уникальных ключей, в данном случае 2х2.
Вас же не удивляет, что если вы делаете два запроса по каждому ключу, то получаете две таблицы, в каждой из которых две строки? Ну а теперь попробуйте их объединить в одну сами, головой? Получится таблица из 4 строк, увы.
Отредактированно Shopen (27.06.2008 16:38:47)
Неактивен
Перечитал еще раз весь поток. Попробую сделать предположение. Предположение
следующее: "у каждого сервиса один телефон".
Если предположение истинно, то Вам нужно искать не группировку, а добавить еще
одно сравнение в WHERE, а именно service.phone_id = phone.id.
Неактивен
Смелое предположение
Особенно учитывая что структуры таблиц мы еще не видели.
P.S. по моему тоже самое будет, если из group by убрать intranet_clients_phones.phone_number... а может и нет )
Отредактированно Shopen (27.06.2008 19:25:20)
Неактивен
Ну, предположение больше основано на желаниях человека Ведь должна
же быть какая-то связь желания с действительностью. Даже если человек не
хочет этого признавать
Неактивен
Очевидно что в данном примере у клиента есть два телефона и он связан с двумя сервисами
поэтому в результате будет именно 4 строки.
Но групировку можно провести несколько иначе, допустим с обьединением телефонов в одном поле, например так:
Неактивен
Не-а, нужно выбрать именно один телефон. В общем, думаю, нужно участие
самого wtopormanа
Неактивен
Sign написал:
Очевидно что в данном примере у клиента есть два телефона и он связан с двумя сервисами
поэтому в результате будет именно 4 строки.
Но групировку можно провести несколько иначе, допустим с обьединением телефонов в одном поле, например так:SELECT
c.*,
act.file_id, act.title,
h.date_of_event, h.type_of_event, h.description_of_event,
GROUP_CONCAT(p.phone_number) phones,
s.*
FROM
intranet_clients c
LEFT JOIN intranet_clients_acts act ON (act.client_id = c.id)
LEFT JOIN intranet_clients_hystory h ON (h.client_id = c.id)
LEFT JOIN intranet_clients_phones p ON (p.client_id = c.id)
LEFT JOIN intranet_clients_services s ON (s.client_id = c.id)
WHERE c.id = 1
GROUP BY p.client_id, s.id;
В результате мы получим:
1;"233-43,322-34";"serv1"
1;"233-43,322-34";"serv2"
paulus, огромное спасибо тебе за помощь, в принципе, такой вариант вполне даже уместен, тем более, можно вывести как раз список телефонов без обхода по циклу и расставления запятых. просто один раз выводим, а на все остальные записи ставим большой и жирный КРЕСТ. Собственно говоря, все вы мне очень сильно помогли... я даже не могу себе представить, сколько еще я бы бился об стену в поиске правильного результата... Огромное спасибо вам всем, за быструю помощь в решении моей проблемы.
Неактивен