Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка нескольких значений из другой таблицы 
:(
    Опции темы
tequomo
Дата 28.7.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



Добрый день!
Имеется две таблицы:

Код


CREATE TABLE IF NOT EXISTS `clientsInfo` (
  `clientsId` tinyint(6) NOT NULL auto_increment,
  `firstName` varchar(50) NOT NULL default '',
  `lastName` varchar(50) NOT NULL default '',
  `clientsUIN` int(6) unsigned NOT NULL default '0',
  PRIMARY KEY  (`clientsId`),
  KEY `ind` (`firstName`,`lastName`,`clientsUIN`)
)

CREATE TABLE IF NOT EXISTS `communicativeData` (
  `requisiteId` tinyint(6) unsigned NOT NULL auto_increment,
  `clientsId` tinyint(6) NOT NULL,
  `requisite` varchar(150) character set cp1251 NOT NULL,
  `reqType` varchar(15) character set cp1251 NOT NULL,
  PRIMARY KEY  (`requisiteId`),
  KEY `commValue` (`requisite`,`reqType`)



где reqType - это homephone, cellphone, email, icq, etc. requisite - собственно содержит либо телефон, либо e-mail, либо еще какой-нибудь реквизит.
Можно ли составить запрос на чистом SQL (без задействования php), выводящий следующее:

          firstName  |  lastName  |  homephone  |  cellphone  |  email  |  clientsUIN

т.е. выводить телефоны и мейлы, соответствующие clientsId из первой таблицы, причем чтобы записи не дублировались, если имеется больше одного телефона. 

Заранее благодарен.


PM MAIL   Вверх
ТоляМБА
Дата 28.7.2008, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 4
Всего: 252



А у тебя в reqType вот это
Цитата(tequomo @  28.7.2008,  21:58 Найти цитируемый пост)
homephone, cellphone, email, icq, etc. requisite
чёхом хранится чтоли?
как ты тогда определяешь что куда здесь выводить:
Цитата(tequomo @  28.7.2008,  21:58 Найти цитируемый пост)
|  homephone  |  cellphone  |  email  | 



PM   Вверх
tequomo
Дата 29.7.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



Вот пример таблицы:
Код

requisiteId    clientsId         requisite           reqType
     1              1           8-050-133-4063    cellphone
     2              1           8-062-257-4904    homephone
     3             15           8-097-912-4373    cellphone
     4             16           8-097-918-8791    cellphone
     5             17           8-066-936-9727    cellphone
     6              8           [email protected]    email

Думаю, лучше было бы сделать еще одну таблицу:
Код

CREATE TABLE IF NOT EXISTS `requisiteType` (
  `reqType` tinyint(3) NOT NULL auto_increment,
  `reqTypeValue` varchar(15) NOT NULL default '',
   PRIMARY KEY  (`reqType`),
  KEY `index` (`reqTypeValue`)
)

и внести в нее типы реквизитов:
Код

     reqType     reqTypeValue
          1           cellphone
          2           homephone
          3           email
          4           icq
          5           url

но от этого код еще более усложнится. Я хотел бы разобраться хотя бы с двумя таблицами.
PM MAIL   Вверх
while
Дата 30.7.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 25.7.2008

Репутация: нет
Всего: нет



select DISTINCT ......
from clientsInfo ci
left join communicativeData cd on (cd.clientsId = ci.clientsId)
PM MAIL   Вверх
tequomo
Дата 30.7.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



Цитата(while @  30.7.2008,  15:26 Найти цитируемый пост)
select DISTINCT ......
from clientsInfo ci
left join communicativeData cd on (cd.clientsId = ci.clientsId) 

Все это прекрасно и замечательно, но во-первых, данный код дублирует строки, т.е. если у клиента 3 телефона, то выводится 3 строки с этим клиентом и разными телефонами, а нужна одна строка с 3-мя телефонами. Во-вторых, мне необходимо рассортировать и вывести в разные колонки cellphone homephone и email, что-то типа этого: 
Код

firstName   |   lastName   |     homephone    |       cellphone       |         email         |    clientsUIN
------------------------------------------------------------------------------------------------------------------
  Иван          Иванов         8-404-335-34-34     8-097-344-34-34       [email protected]         111111
                               8-404-377-37-37
------------------------------------------------------------------------------------------------------------
  Петр          Петров         8-404-218-44-44     8-063-111-22-33       [email protected]          222222
                                                   8-067-908-98-98
------------------------------------------------------------------------------------------------------------------
.....

PM MAIL   Вверх
while
Дата 30.7.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 25.7.2008

Репутация: нет
Всего: нет



Вообще-то

Цитата

чтобы записи не дублировалисть


и

Цитата

нужна одна строка с 3-мя телефонами


совершенно РАЗНЫЕ УСЛОВИЯ smile

Например, можно с помощью ХП и курсоров. А что бы сделать это нужно как минимум название СУБД, с которой ты работаеш... и версия...

PM MAIL   Вверх
tequomo
Дата 31.7.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



MySQL 5.0.45
PM MAIL   Вверх
olegDBA
Дата 31.7.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 31.7.2008

Репутация: нет
Всего: нет



Итак - я согласен полностью с while - трезвое замечание, молодец!
Как бы реализуя его замечание я предлагаю выводить результат с помощью функции, с использованием курсоров:
Код

CREATE function dbo.ParserRequisite (@clientsId int, @reqType VARCHAR(20))
RETURNs varchar(255)
begin
declare @requisite varchar(150)
declare @temprequisite varchar(255)
declare @fullrequisite varchar(255)
set @fullrequisite = ''
declare CCursor cursor for
select D.requisite
from communicativeData D
where d.clientsId = @clientsId and d.reqType=@reqType
open Ccursor
FETCH next from CCursor into @requisite
while @@FETCH_STATUS=0
begin
set @fullrequisite=@fullrequisite+'  '+@requisite
FETCH next from CCursor into @requisite
end
CLOSE CCursor
DEALLOCATE CCursor
return @fullrequisite
end


она на входе берёт номер человечка и тип реквизита(это не гибкое решение), а на выходе через пробел выводит список телефонов в одну строку, которую используем в запросе подобного типа 
Код

select
distinct
i.firstName,
I.lastName,
dbo.ParserRequisite(1,'homephone') as homephone,
dbo.ParserRequisite(1,'mobilephone') as mobilephone,
i.clientsUIN
from  clientsInfo I
join communicativeData D on D.clientsId=i.clientsId


т.е. из ПХП придётся грамотно передавать ей параметры, или tequomo необходимо будет её немного доработать

итог запроса такой 
firstName    lastName      homephone                              mobilephone           clientsUIN
Oleg                   Popov      8-012002145  8-012344455      8-067-1234567    1
Vadim           Norb              8-012002145  8-012344455      8-067-1234567    2
Думаю основная тема автора раскрыта, желаю удачиsmile
Да, я писал под MS SQL SERVER 2000, под мускул автору возможно надо будет немного подрихтовать запросы
PM MAIL   Вверх
RockClimber
Дата 6.8.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 848
Регистрация: 5.5.2006
Где: планета 013 в тен туре

Репутация: нет
Всего: 15



olegDBA, в PostgreSQL такая функция уже реализована и называется crosstab (их там целое семейство). И что-то мне подсказывает, что и во всех остальных популярных СУБД тоже...
Если тема актуальна, могу привести пример довольно сложного запроса с использованием этой функции.


--------------------
Хорошо кинутый дятел далеко летит, крепко встревает, долго торчит.
PM MAIL GTalk   Вверх
tequomo
Дата 6.8.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



Цитата(RockClimber @  6.8.2008,  10:07 Найти цитируемый пост)
Если тема актуальна

Тема актуальна, буду благодарен за помощь. 
Цитата(olegDBA @  31.7.2008,  17:51 Найти цитируемый пост)
она на входе берёт номер человечка и тип реквизита(это не гибкое решение)

Согласен. Я хотел пересмотреть структуру базы и унифицировать все реквизиты, поэтому и создал такую таблицу. Ситуация банальная: у клиента может быть несколько телефонов или e-mail`ов, но в книгах по php-mysql я не видел гибкого решения. Сейчас у меня несколько телефонов или емейлов джойнятся в строку и хранятся в одной ячейке. Я не знаю, что будет работать быстрее и лучше: описанная выше структура или несколько таблиц clientsId-cellPhone, clientsId-homePhone, clientsId-eMail и т.д. при количестве записей в несколько тысяч.
P.S. По поводу Вашего кода, в mysql там процедуры пишутся немного по-другому, я с ними не работал, сейчас разбираюсь.

Это сообщение отредактировал(а) tequomo - 6.8.2008, 17:51
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1066 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.