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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> объединение таблиц 
V
    Опции темы
NCIAC
Дата 7.2.2009, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте, не могу связать правильно таблицы. Суть такова: Пользователь, представитель фирмы, авторизуется н асайте и получает возможность редактировать данные о своей фирме. Но администратор сайта должен просмотреть изменеия и отредактировать их. Для этого созданы временный таблицы, куда заносятся пользовательские данные. Всего временных таблиц 3:

Код

//таблица фирм:
CREATE TABLE `firms` (
`id` int(25) NOT NULL auto_increment,
`name` varchar(100) default NULL,
- - -
PRIMARY KEY (`id`)
)

/*временная таблица фирм*/
CREATE TABLE `temp_firms` (
`id` int(25) NOT NULL auto_increment,
`id_orig` int(25) default NULL,
`name` varchar(255) NOT NULL,
/*- - - */
PRIMARY KEY (`id`)
)

/*если у фирмы есть дополнительный адрес, то его id из таблицы temp_dopa присутствует в этой промежуточной таблице:*/
CREATE TABLE `temp_firms_dop` (
`id` int(255) NOT NULL auto_increment,
`firms_id` int(255) NOT NULL,
`dopf_id` int(255) NOT NULL,
PRIMARY KEY (`id`)
)

/*фирма состоит в какой-то категории (одной или нескольких) и если пользователь поменял информацию о "категорийности" своей фирмы, то в данной таблице создаются записи о категоряях:*/
CREATE TABLE `temp_podcat_firms` (
`id` int(255) NOT NULL auto_increment,
`podcat_id` int(255) NOT NULL,
`firms_id` int(255) NOT NULL,
PRIMARY KEY (`id`)
)


По воле обстоятельств создалась необходимость узнать id фирмы, бля которой были сделаны какие-то изменения (изменения в осн. таблице, в таблице категорий или доп. адреса). Делаю след. запрос:
Код

SELECT DISTINCT `firms`.`id`, `firms`.`name` 
FROM `firms`, `temp_firms`, `temp_firms_dop`, `temp_podcat_firms`
WHERE `firms`.`id`=`temp_podcat_firms`.`firms_id`
OR `firms`.`id`=`temp_firms`.`id_orig` 
OR `firms`.`id`=`temp_firms_dop`.`firms_id`

Но проблема в том, что если хотябы одна таблица пуста, то ничего не выбирается.
Прошу помощи.

Это сообщение отредактировал(а) skyboy - 7.2.2009, 01:38
PM MAIL   Вверх
skyboy
Дата 7.2.2009, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



надо вместо inner join(хоть и неявно, но ты практически используешь inner join в своем запросе) использовать left join:
Код

SELECT DISTINCT `firms`.`id`, `firms`.`name` 
FROM `firms`
LEFT JOIN `temp_firms` ON `firms`.`id`=`temp_firms`.`id_orig` 
LEFT JOIN `temp_firms_dop` ON   `firms`.`id`=`temp_firms_dop`.`firms_id`
LEFT JOIN `temp_podcat_firms` ON `firms`.`id`=`temp_podcat_firms`.`firms_id`

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


Шустрый
*


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

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



Цитата(skyboy @ 7.2.2009,  01:42)
надо вместо inner join(хоть и неявно, но ты практически используешь inner join в своем запросе) использовать left join:
Код

SELECT DISTINCT `firms`.`id`, `firms`.`name` 
FROM `firms`
LEFT JOIN `temp_firms` ON `firms`.`id`=`temp_firms`.`id_orig` 
LEFT JOIN `temp_firms_dop` ON   `firms`.`id`=`temp_firms_dop`.`firms_id`
LEFT JOIN `temp_podcat_firms` ON `firms`.`id`=`temp_podcat_firms`.`firms_id`

К сожалению, данная штука не работает :(( Запрос выбирает все фирмы подряд. Может есть ещё какие-либо варианты?
PM MAIL   Вверх
ecspertiza
Дата 8.2.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

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



попробуй подзапросы, тобишь запрос внутри другого запроса.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
skyboy
Дата 8.2.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



да. поспешил. не вник.
надо добавить условие, чтоб выбрать только те записи, у которых есть хотя бы одно соответствие в дополнительных таблицах:
Код

SELECT DISTINCT `firms`.`id`, `firms`.`name` 
FROM `firms`
LEFT JOIN `temp_firms` ON `firms`.`id`=`temp_firms`.`id_orig` 
LEFT JOIN `temp_firms_dop` ON   `firms`.`id`=`temp_firms_dop`.`firms_id`
LEFT JOIN `temp_podcat_firms` ON `firms`.`id`=`temp_podcat_firms`.`firms_id`
WHERE `temp_firms`.`id_orig` is not NULL 
OR `temp_firms_dop`.`firms_id` is not NULL
OR `temp_podcat_firms`.`firms_id` is not NULL

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


Шустрый
*


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

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



Цитата(skyboy @ 8.2.2009,  16:22)
да. поспешил. не вник.
надо добавить условие, чтоб выбрать только те записи, у которых есть хотя бы одно соответствие в дополнительных таблицах:
Код

SELECT DISTINCT `firms`.`id`, `firms`.`name` 
FROM `firms`
LEFT JOIN `temp_firms` ON `firms`.`id`=`temp_firms`.`id_orig` 
LEFT JOIN `temp_firms_dop` ON   `firms`.`id`=`temp_firms_dop`.`firms_id`
LEFT JOIN `temp_podcat_firms` ON `firms`.`id`=`temp_podcat_firms`.`firms_id`
WHERE `temp_firms`.`id_orig` is not NULL 
OR `temp_firms_dop`.`firms_id` is not NULL
OR `temp_podcat_firms`.`firms_id` is not NULL

А это то что надо! спасибо! Это всё-таки лёчший форум!
PM MAIL   Вверх
skyboy
Дата 8.2.2009, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



NCIAC, у нас принято: решился вопрос - пометь тему решенной. Над первым(твоим) сообщениям в теме ссылка "Пометить вопрос решенным".
И цитировать код не надо. Посмотри, как сообщение от этого увеличивается. А толку-то от такого цитирования - ноль.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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