SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 19.06.2008 16:52:50

wtoporman
Участник
Откуда: Москва
Зарегистрирован: 19.06.2008
Сообщений: 14

Люди добрые. Требуется ваша помощь.

Есть запрос:

Код:

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 19.06.2008 18:31:09

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Люди добрые. Требуется ваша помощь.

По-хорошему должно получится 2 столбца.

Ну вы ж сами перечислили после SELECT кучу столбцов которые хотите, включая ВСЕ столбцы из двух таблиц.

Что то не сходится

Неактивен

 

#3 19.06.2008 18:58:05

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Люди добрые. Требуется ваша помощь.

Вообще я так подозреваю, что Вам нужно просто

SELECT DISTINCT ... (дальше все, как у Вас было)


но должен сказать, что Вы не совсем понятно сформулировали задачу.

По-хорошему должно получится 2 столбца

может быть любое значение строк принадлежащих для определенного клиента. Вопрос в том, как их сгруппировать так, чтоб выводились уникальные столбцы без повторов.

Видимо, Вы имели в виду уникальные строки, а не столбцы (чтобы вывести два столбца, надо в запросе их и указать).
Каков критерий группировки и какая нужна информация для каждой уникальной записи?

Неактивен

 

#4 23.06.2008 14:42:46

wtoporman
Участник
Откуда: Москва
Зарегистрирован: 19.06.2008
Сообщений: 14

Re: Люди добрые. Требуется ваша помощь.

В общем, на самом деле, мне нужны именно уникальные строки.. Дело в том, что в таблицах с телефонами и сервисами есть несколько записей для каждого клиента. надо выбрать так, чтобы в конечном итоге записи в строках не повторялись.... В принципе, телефоны и сервисы я уже выбираю отдельными запросами. Просто интересно, возможно ли оптимизировать все в один запрос или нет?? Большое спасибо за помощь......


Я не ГУРУ, я только учусь.

Неактивен

 

#5 23.06.2008 15:09:50

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Люди добрые. Требуется ваша помощь.

В вашем резльтате и есть четыре уникальных строки. Если отсеить ненужный мусор, то останется вот это:

Код:

1;"233-43";"serv1"
1;"233-43";"serv2"
1;"322-34";"serv1"
1;"322-34";"serv2"

т.е. четыре уникальных комбинации значений, именно по ним вы и группируете. Если это не то, что вы хотели - то объясните, что в вашем понимании "уникальные строки".
Просто возьмите и нарисуйте на бумаге ту таблицу, которая по вашему должна получится, думаю сразу вопросы отпадут.

Неактивен

 

#6 25.06.2008 15:26:51

wtoporman
Участник
Откуда: Москва
Зарегистрирован: 19.06.2008
Сообщений: 14

Re: Люди добрые. Требуется ваша помощь.

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"

вот это, в принципе я и имел в виду....

Заранее спасибо....


Я не ГУРУ, я только учусь.

Неактивен

 

#7 25.06.2008 15:55:18

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Люди добрые. Требуется ваша помощь.

Эээ... а какой логикой Вы руводствуетесь при выборе строк? Чем такая комбинация
строк лучше, чем, скажем,

1;"233-43";"serv2"
1;"322-34";"serv1"

Неактивен

 

#8 25.06.2008 16:08:09

wtoporman
Участник
Откуда: Москва
Зарегистрирован: 19.06.2008
Сообщений: 14

Re: Люди добрые. Требуется ваша помощь.

paulus написал:

Эээ... а какой логикой Вы руводствуетесь при выборе строк? Чем такая комбинация
строк лучше, чем, скажем,

1;"233-43";"serv2"
1;"322-34";"serv1"

Дело вовсе не в комбинации строк, необходимо просто сделать чтобы одинаковые номера телефонов так же как и одинаковые сервисы не отображались.


Я не ГУРУ, я только учусь.

Неактивен

 

#9 25.06.2008 17:07:55

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Люди добрые. Требуется ваша помощь.

Мои две строки удовлетворяют этим требованиям. При этом они не совпадают
с Вашими. Какой критерий выбора?

Неактивен

 

#10 27.06.2008 14:30:28

wtoporman
Участник
Откуда: Москва
Зарегистрирован: 19.06.2008
Сообщений: 14

Re: Люди добрые. Требуется ваша помощь.

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 номера телефона.... На выходе они не должны дублироваться. Как можно их сгруппировать???


Я не ГУРУ, я только учусь.

Неактивен

 

#11 27.06.2008 16:37:49

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Люди добрые. Требуется ваша помощь.

никак этого не сделать в ОДНОЙ таблице.
Вы не сделали самого главного - не нарисовали таблицу на бумаге.

Вы можете сгруппировать по телефонам - у вас получится две строки
Вы можете сгруппировать по сервисам - у вас тоже получится две строки

но если вы группируете и по тому и по тому, а связи между телефонами и сервисами нет (уникальность телефонов не параллельна уникальности сервисов, т.е. каждому сервису не противопоставлен конкретный телефон), то у вас всегда получится таблица с количеством строк равным произведению уникальных ключей, в данном случае 2х2.

Вас же не удивляет, что если вы делаете два запроса по каждому ключу, то получаете две таблицы, в каждой из которых две строки? Ну а теперь попробуйте их объединить в одну сами, головой? Получится таблица из 4 строк, увы.

Отредактированно Shopen (27.06.2008 16:38:47)

Неактивен

 

#12 27.06.2008 19:01:35

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Люди добрые. Требуется ваша помощь.

Перечитал еще раз весь поток. Попробую сделать предположение. Предположение
следующее: "у каждого сервиса один телефон".

Если предположение истинно, то Вам нужно искать не группировку, а добавить еще
одно сравнение в WHERE, а именно service.phone_id = phone.id.

Неактивен

 

#13 27.06.2008 19:24:31

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Люди добрые. Требуется ваша помощь.

Смелое предположение smile
Особенно учитывая что структуры таблиц мы еще не видели.

P.S. по моему тоже самое будет, если из group by убрать intranet_clients_phones.phone_number... а может и нет )

Отредактированно Shopen (27.06.2008 19:25:20)

Неактивен

 

#14 27.06.2008 19:58:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Люди добрые. Требуется ваша помощь.

Ну, предположение больше основано на желаниях человека smile Ведь должна
же быть какая-то связь желания с действительностью. Даже если человек не
хочет этого признавать smile

Неактивен

 

#15 28.06.2008 11:33:38

Sign
Гуру
Зарегистрирован: 26.06.2008
Сообщений: 43

Re: Люди добрые. Требуется ваша помощь.

Очевидно что в данном примере у клиента есть два телефона и он связан с двумя сервисами
поэтому в результате будет именно 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"

Неактивен

 

#16 28.06.2008 13:04:40

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Люди добрые. Требуется ваша помощь.

Не-а, нужно выбрать именно один телефон. В общем, думаю, нужно участие
самого wtopormanа smile

Неактивен

 

#17 08.07.2008 18:15:00

wtoporman
Участник
Откуда: Москва
Зарегистрирован: 19.06.2008
Сообщений: 14

Re: Люди добрые. Требуется ваша помощь.

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, огромное спасибо тебе за помощь, в принципе, такой вариант вполне даже уместен, тем более, можно вывести как раз  список телефонов без обхода по циклу и расставления запятых. просто один раз выводим, а на все остальные записи ставим большой и жирный КРЕСТ. Собственно говоря, все вы мне очень сильно помогли... я даже не могу себе представить, сколько еще я бы бился об стену в поиске правильного результата... Огромное спасибо вам всем, за быструю помощь в решении моей проблемы.


Я не ГУРУ, я только учусь.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson