![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
tequomo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Добрый день!
Имеется две таблицы:
где reqType - это homephone, cellphone, email, icq, etc. requisite - собственно содержит либо телефон, либо e-mail, либо еще какой-нибудь реквизит. Можно ли составить запрос на чистом SQL (без задействования php), выводящий следующее: firstName | lastName | homephone | cellphone | email | clientsUIN т.е. выводить телефоны и мейлы, соответствующие clientsId из первой таблицы, причем чтобы записи не дублировались, если имеется больше одного телефона. Заранее благодарен. |
|||
|
||||
ТоляМБА |
|
|||
![]() Котэ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1607 Регистрация: 15.12.2004 Репутация: 4 Всего: 252 |
||||
|
||||
tequomo |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Вот пример таблицы:
Думаю, лучше было бы сделать еще одну таблицу:
и внести в нее типы реквизитов:
но от этого код еще более усложнится. Я хотел бы разобраться хотя бы с двумя таблицами. |
||||||
|
|||||||
while |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 25.7.2008 Репутация: нет Всего: нет |
select DISTINCT ......
from clientsInfo ci left join communicativeData cd on (cd.clientsId = ci.clientsId) |
|||
|
||||
tequomo |
|
||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Все это прекрасно и замечательно, но во-первых, данный код дублирует строки, т.е. если у клиента 3 телефона, то выводится 3 строки с этим клиентом и разными телефонами, а нужна одна строка с 3-мя телефонами. Во-вторых, мне необходимо рассортировать и вывести в разные колонки cellphone homephone и email, что-то типа этого:
|
||||
|
|||||
while |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 25.7.2008 Репутация: нет Всего: нет |
Вообще-то
и
совершенно РАЗНЫЕ УСЛОВИЯ ![]() Например, можно с помощью ХП и курсоров. А что бы сделать это нужно как минимум название СУБД, с которой ты работаеш... и версия... |
||||
|
|||||
tequomo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
MySQL 5.0.45
|
|||
|
||||
olegDBA |
|
||||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 31.7.2008 Репутация: нет Всего: нет |
Итак - я согласен полностью с while - трезвое замечание, молодец!
Как бы реализуя его замечание я предлагаю выводить результат с помощью функции, с использованием курсоров:
она на входе берёт номер человечка и тип реквизита(это не гибкое решение), а на выходе через пробел выводит список телефонов в одну строку, которую используем в запросе подобного типа
т.е. из ПХП придётся грамотно передавать ей параметры, или 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 Думаю основная тема автора раскрыта, желаю удачи ![]() Да, я писал под MS SQL SERVER 2000, под мускул автору возможно надо будет немного подрихтовать запросы |
||||
|
|||||
RockClimber |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 848 Регистрация: 5.5.2006 Где: планета 013 в тен туре Репутация: нет Всего: 15 |
olegDBA, в PostgreSQL такая функция уже реализована и называется crosstab (их там целое семейство). И что-то мне подсказывает, что и во всех остальных популярных СУБД тоже...
Если тема актуальна, могу привести пример довольно сложного запроса с использованием этой функции. -------------------- Хорошо кинутый дятел далеко летит, крепко встревает, долго торчит. |
|||
|
||||
tequomo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Тема актуальна, буду благодарен за помощь.
Согласен. Я хотел пересмотреть структуру базы и унифицировать все реквизиты, поэтому и создал такую таблицу. Ситуация банальная: у клиента может быть несколько телефонов или e-mail`ов, но в книгах по php-mysql я не видел гибкого решения. Сейчас у меня несколько телефонов или емейлов джойнятся в строку и хранятся в одной ячейке. Я не знаю, что будет работать быстрее и лучше: описанная выше структура или несколько таблиц clientsId-cellPhone, clientsId-homePhone, clientsId-eMail и т.д. при количестве записей в несколько тысяч. P.S. По поводу Вашего кода, в mysql там процедуры пишутся немного по-другому, я с ними не работал, сейчас разбираюсь. Это сообщение отредактировал(а) tequomo - 6.8.2008, 17:51 |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |