Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > объединение таблиц


Автор: NCIAC 7.2.2009, 01:18
Здравствуйте, не могу связать правильно таблицы. Суть такова: Пользователь, представитель фирмы, авторизуется н асайте и получает возможность редактировать данные о своей фирме. Но администратор сайта должен просмотреть изменеия и отредактировать их. Для этого созданы временный таблицы, куда заносятся пользовательские данные. Всего временных таблиц 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: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`

Автор: NCIAC 8.2.2009, 15:25
Цитата(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`

К сожалению, данная штука не работает :(( Запрос выбирает все фирмы подряд. Может есть ещё какие-либо варианты?

Автор: ecspertiza 8.2.2009, 15:54
попробуй подзапросы, тобишь запрос внутри другого запроса.

Автор: 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

Автор: NCIAC 8.2.2009, 17:10
Цитата(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

А это то что надо! спасибо! Это всё-таки лёчший форум!

Автор: skyboy 8.2.2009, 20:41
NCIAC, у нас принято: решился вопрос - пометь тему решенной. Над первым(твоим) сообщениям в теме ссылка "Пометить вопрос решенным".
И цитировать код не надо. Посмотри, как сообщение от этого увеличивается. А толку-то от такого цитирования - ноль.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)