Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объединение трех таблиц с помощью LEFT JOIN, Не могу объединить три таблицы, использу 
:(
    Опции темы
Reverent
  Дата 12.8.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день, я столкнулся с проблемой объединения трех таблиц с помощью оператора LEFT JOIN. Когда соединяю две таблицы, все работает как надо, а как только хочу соединить три, сразу происходит косяк. Вот такие таблицы у меня есть:

Таблица содержит компании:
Код

CREATE TABLE IF NOT EXISTS company
(
id_company MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,

nameCompany VARCHAR(255) NOT NULL,

PRIMARY KEY(id_company)
) DEFAULT CHARSET=cp1251;


Таблица содержит виды деятельности, которые могут предоставляться компаниями
Код

CREATE TABLE IF NOT EXISTS jobs
(
id_jobs MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,

nameJob VARCHAR(255) NOT NULL,

PRIMARY KEY(id_jobs)
) DEFAULT CHARSET=cp1251;


Таблица содержит бренды, которыми пользуются компании
Код

CREATE TABLE IF NOT EXISTS brends
(
id_brends MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,

nameBrend VARCHAR(255) NOT NULL,

PRIMARY KEY(id_brends)
) DEFAULT CHARSET=cp1251;


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

CREATE TABLE IF NOT EXISTS companyJobs
(
id_companyJobs MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,

id_company MEDIUMINT UNSIGNED NOT NULL, 
id_jobs MEDIUMINT UNSIGNED NOT NULL,

PRIMARY KEY(id_companyJobs),
INDEX(id_company), 
INDEX(id_jobs)
)  DEFAULT CHARSET=cp1251;


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

CREATE TABLE IF NOT EXISTS companyBrends
(
id_companyBrends MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,

id_company MEDIUMINT UNSIGNED NOT NULL, 
id_brends MEDIUMINT UNSIGNED NOT NULL,

PRIMARY KEY(id_companyBrends),
INDEX(id_company), 
INDEX(id_brends)
) DEFAULT CHARSET=cp1251;


Запихнем левые данные для удобства работы:
Код

INSERT INTO company (id_company, nameCompany) VALUES (1, "First firm");
INSERT INTO company (id_company, nameCompany) VALUES (2, "Second firm");
INSERT INTO company (id_company, nameCompany) VALUES (3, "Third firm");

INSERT INTO jobs (id_jobs, nameJob) VALUES (1, "First job");
INSERT INTO jobs (id_jobs, nameJob) VALUES (2, "Second job");
INSERT INTO jobs (id_jobs, nameJob) VALUES (3, "Third job");

INSERT INTO brends (id_brends, nameBrend) VALUES (1, "First brend");
INSERT INTO brends (id_brends, nameBrend) VALUES (2, "Second brend");
INSERT INTO brends (id_brends, nameBrend) VALUES (3, "Third brend");

INSERT INTO companyJobs (id_companyJobs, id_company, id_jobs) VALUES (1, 1, 1);
INSERT INTO companyJobs (id_companyJobs, id_company, id_jobs) VALUES (2, 1, 3);
INSERT INTO companyJobs (id_companyJobs, id_company, id_jobs) VALUES (3, 2, 1);
INSERT INTO companyJobs (id_companyJobs, id_company, id_jobs) VALUES (4, 3, 2);

INSERT INTO companyBrends (id_companyBrends, id_company, id_brends) VALUES (1, 1, 2);
INSERT INTO companyBrends (id_companyBrends, id_company, id_brends) VALUES (2, 1, 1);
INSERT INTO companyBrends (id_companyBrends, id_company, id_brends) VALUES (3, 3, 1);
INSERT INTO companyBrends (id_companyBrends, id_company, id_brends) VALUES (4, 3, 2);
INSERT INTO companyBrends (id_companyBrends, id_company, id_brends) VALUES (5, 3, 3);


А теперь основная задача вывести все компании, не дублируя их, и показать все виды деятельности и используемые бренды, в отдельных столбцах, разделенные точкой с запятой. И еще нужно учесть тот факт, что компания вообще может не иметь не видов деятельности, не брендов, но при выводе ее все равно нужно показать. Я делаю так:

Код

SELECT 

company.id_company AS id_company, 
nameCompany, 
GROUP_CONCAT(nameBrend SEPARATOR '; ') AS nameBrend, 
GROUP_CONCAT(nameJob SEPARATOR '; ') AS nameJob 

FROM 

company 
LEFT JOIN companyBrends ON companyBrends.id_company = company.id_company 
LEFT JOIN brends ON brends.id_brends = companyBrends.id_brends 
LEFT JOIN companyJobs ON companyJobs.id_company = company.id_company 
LEFT JOIN jobs ON jobs.id_jobs = companyJobs.id_jobs 

GROUP BY company.id_company;


У меня получается, что в ячейки происходит дублирование информации, причем дубляж происходит ровно стока, раз скока есть значений в показатели бренда компании/вида деятельности компании.

Почему так? Как убрать дублирование?

Это сообщение отредактировал(а) Reverent - 12.8.2009, 19:31
PM MAIL   Вверх
unicross
Дата 12.8.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

GROUP_CONCAT(DISTINCT nameBrend SEPARATOR '; ') AS nameBrend, 
GROUP_CONCAT(DISTINCT nameJob SEPARATOR '; ') AS nameJob 

?
PM MAIL WWW   Вверх
Reverent
Дата 12.8.2009, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



DISTINCT - позволяет вывести уникальные значения я так понимаю? Хитрая штука smile.. огромное спасибо за подсказку!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




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


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

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