SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 13.04.2016 14:32:19

Alaksander
Участник
Зарегистрирован: 13.04.2016
Сообщений: 3

Связь таблицы с таблицей-справочником

Имеется упрощенная таблица 'articles' с полями 'id', 'title' и два «набора» ('set1' и 'set2').
Для полей 'set1' и 'set2' есть одноименные таблицы, содержащие колонки, соответствующие полям 'id' из таблицы 'catalogue'.
Таблица-справочник 'catalogue' содержит представление по группам и подгруппам, связывается через триггеры с таблицами 'set1' и 'set2' для обеспечения целостности данных.
Задача состоит в следующем, необходимо получать выборку, в которой будут связаны наименования 'item' из таблицы 'catalogue' с соответствующим значением из таблицы 'set1' и 'set2', по их 'id' в таблице 'articles', как на примере в результирующей таблице 'result1', так и для выполнения обратной задачи - поиска 'id' из 'articles' по 'set1' и 'set2', где 'id' из 'catalogue' отлично от нуля.
Таблицы 'set1' и 'set2' идентичны, но поиск по первой производится несравнимо чаще, чем по второй, плюс меньшее количество записей, возможно, имеет смысл держать их раздельно.
Вопрос в том, как связать 'id' из 'catalogue' с соответствующими полями из 'set1' и 'set2', чтобы получить нечто подобное результирующей таблице 'result1', либо в ином виде «наименование=количество».
Предложенное видение решения выглядит громоздким и не позволяет использовать в полной мере нативные mysql функции, вынуждает прибегать к более, чем одному запросу. Хотелось бы услышать либо вариант решения предложенной схемы, либо варианты изменения таблиц с учетом двух нормальных форм.

Отредактированно Alaksander (13.04.2016 15:32:31)


Прикрепленные файлы:
Attachment Icon db.jpg, Размер: 118,605 байт, Скачано: 428

Неактивен

 

#2 13.04.2016 16:48:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Связь таблицы с таблицей-справочником

Кажется, табличка каталога тут лишняя вообще. Базовая конструкция какая-то такая:

SELECT id, title, set1.*, set2.*
FROM articles
LEFT JOIN set1 ON (articles.set1 = set1.id)
LEFT JOIN set2 ON (articles.set2 = set2.id)

А вот чтобы получить строки так, как Вы хотите, то придется делать много костылей, возможно, Вы захотите это делать в приложении. Костылики будут состоять из IF и CONCAT_WS. Что-то такое:

CONCAT_WS(',', IF(set1.`1`>0,CONCAT('item1=',set1.`1`),NULL), ...)

Неактивен

 

#3 13.04.2016 17:02:00

Alaksander
Участник
Зарегистрирован: 13.04.2016
Сообщений: 3

Re: Связь таблицы с таблицей-справочником

Таблица каталога нужна как обратная связь, пользователь, выбирая из визуального представления таблицы по группам и подгруппам через их id формирует набор set1 set2 для новой записи, к тому же из каталога «подтягиваются» названия по id, чтобы сопоставить их с соответствующим количеством. Ваш вариант интересный, но возникает проблема, при добавлении нового пункта в каталог и соответственно в set1 и set2, строка запроса станет устаревшей, да и опять же, что мое представление, что ваше — очень громоздкое и не изящное, сдается мне, где-то я не по тому пути пошел, все́ оптимальные решения просты по своей сути, а тут такое нагорождение

Неактивен

 

#4 13.04.2016 17:21:46

Alaksander
Участник
Зарегистрирован: 13.04.2016
Сообщений: 3

Re: Связь таблицы с таблицей-справочником

Все было бы просто, если бы иметь оператор, возвращающий название столбца, поле которого удовлетворяет предикату, тогда осталось бы этот возвращенный id найти в таблице catalogue

Неактивен

 

Board footer

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