Задавайте вопросы, мы ответим
Вы не зашли.
Имеется упрощенная таблица '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)
Неактивен
Кажется, табличка каталога тут лишняя вообще. Базовая конструкция какая-то такая:
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), ...)
Неактивен
Таблица каталога нужна как обратная связь, пользователь, выбирая из визуального представления таблицы по группам и подгруппам через их id формирует набор set1 set2 для новой записи, к тому же из каталога «подтягиваются» названия по id, чтобы сопоставить их с соответствующим количеством. Ваш вариант интересный, но возникает проблема, при добавлении нового пункта в каталог и соответственно в set1 и set2, строка запроса станет устаревшей, да и опять же, что мое представление, что ваше — очень громоздкое и не изящное, сдается мне, где-то я не по тому пути пошел, все́ оптимальные решения просты по своей сути, а тут такое нагорождение
Неактивен
Все было бы просто, если бы иметь оператор, возвращающий название столбца, поле которого удовлетворяет предикату, тогда осталось бы этот возвращенный id найти в таблице catalogue
Неактивен