SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 02.03.2012 15:30:42

Mobelis
Участник
Зарегистрирован: 15.08.2010
Сообщений: 10

Получение данных через связующие таблицу (3 таблицы 1 связующая)

Добрый день.
Есть 3 таблицы: cats,oblast,items , которые связаны через таблицу itemcat. Поменять связь не получиться, т.к. это вводятся изменения в уже рабочую cms. Изначально связь была items и cats через itemcat. Но, так как появилась необходимость добавить таблицу oblast , при этом не сильно "расковыривая" код, было принято решение связь между items и oblast так же реализовать через itemcat. Да, можно было бы обойти разными способами, посмотрев на структуру таблиц oblast и cats , Вы не найдете отличий, и это так. Можно было в таблицу cats добавить некое поле, и для категорий поле было равное 0, для областей - 1. Но требовалось именно отделение областей от категорий физически. Для дальнейших нужд.

Теперь к сути проблемы. т.к. в таблице itemcat появилась доп.связь, это приводит к дублированию записей.
Выполняя такой запрос:


SELECT c.id, c.title_full, c.path_full, i.item_id
FROM `itemcat` i, `cats` c
WHERE c.id=i.cat_id
AND i.item_id IN (133,134)
 

Получаем результат:
http://mobelis.od.ua/img/query_1.jpg

Выходит, что в таблице itemcat 4 записи для item_id 133.
http://mobelis.od.ua/img/table_1.jpg
И для cat_id по 2 записи.

Вопрос:
Как составить правильно запрос, чтобы не происходило дублирования при запросе информации о items и cats , и так же о items и oblast. Вариант использовать
GROUP BY `cat_id`
и для получения области
GROUP BY `oblast_id`
не подходят, т.к. при выполнении такого запроса:

SELECT c.id, c.title_full, c.path_full, i.item_id
            FROM `itemcat` i, `cats` c
            WHERE c.id=i.cat_id AND i.item_id IN (69,67,68)
 
при котором в результат попадают для одной категории несколько items.

Прикрепляю дамп необходимых таблиц с заполненными тестовыми данными.


Прикрепленные файлы:
Attachment Icon database.sql, Размер: 320,961 байт, Скачано: 898

Неактивен

 

#2 02.03.2012 16:20:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Получение данных через связующие таблицу (3 таблицы 1 связующая)

Добавить distinct ?

Неактивен

 

#3 02.03.2012 17:28:19

Mobelis
Участник
Зарегистрирован: 15.08.2010
Сообщений: 10

Re: Получение данных через связующие таблицу (3 таблицы 1 связующая)

Да Вы правы. Большое спасибо. Быть может кому пригодится тут изложенная проблема и решение:

SELECT DISTINCT c.id, c.title_full, c.path_full, i.item_id
FROM `itemcat` i, `cats` c
WHERE c.id=i.cat_id
AND i.item_id IN (133,134)

http://mobelis.od.ua/img/query_2.jpg

Отредактированно Mobelis (02.03.2012 17:31:19)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson