Как сделать MySql выборку из несколькиз таблиц?
Здравствуйте.
Есть такая схема таблиц:
Нужно:
Составить запрос так, чтобы отобрать все записи из таблицы Resources со значениями из таблицы Variable_values.
Результат должен выглядеть примерно так:
resource ----id ----title ----variables --------variable ------------id ------------title ------------values ----------------value ----------------value ----------------value --------variable ------------id ------------title ------------values ----------------value ----------------value ----------------value --------variable ------------id ------------title ------------values ----------------value ----------------value ----------------value ----childs --------resource ------------id ------------title ------------variables ----------------variable --------------------id --------------------title --------------------values ------------------------value ------------------------value ------------------------value ------------childs и т.д. |
resource ----id ----title ----variables --------variable ------------id ------------title ------------values ----------------value ----------------value ----------------value --------variable ------------id ------------title ------------values ----------------value ----------------value ----------------value --------variable ------------id ------------title ------------values ----------------value ----------------value ----------------value ----childs --------resource ------------id ------------title ------------variables ----------------variable --------------------id --------------------title --------------------values ------------------------value ------------------------value ------------------------value ------------childs и т.д.
Таблица Resources древовидная. Глубина не ограничена. Но для моей задачи мне нужно выбрать все записи, у которых соблюдены такие условия и вложенность:
Запись с шаблоном Модель
----Запись с шаблоном Дизайн модели
--------Запись с шаблоном Серия дизайна
То есть глубина вложенности 3. id шаблонов известны изначально.
С этой задачей я могу справиться так:
SELECT * FROM Resources AS Models LEFT JOIN Resources AS Designs ON Designs.parent_id = Models.id LEFT JOIN Resources AS Batches ON Batches.parent_id = Designs.id WHERE Designs.template_id = id шаблона дизайна модели AND WHERE Batches.template_id = id шаблона серии дизайна |
SELECT * FROM Resources AS Models LEFT JOIN Resources AS Designs ON Designs.parent_id = Models.id LEFT JOIN Resources AS Batches ON Batches.parent_id = Designs.id WHERE Designs.template_id = id шаблона дизайна модели AND WHERE Batches.template_id = id шаблона серии дизайна
А вот дальше как присоединить переменные (Variables) и их значения (Variable_values) не понимаю. Джойнить выходит очень накладно по времени выполнения запроса.
Запрос хотелось бы иметь всего один, так как необходимо использовать LIMIT на выборку, а также разные условия для выборки (Where).
Подскажите, пожалуйста, какие варианты вы видите.
Дополнительно:
MySQL какой версии?
https://sqlize.online/?phpses=null&sqlses=8085791a...
Ответы:
SELECT * FROM Resources AS Models LEFT JOIN Resources AS Designs ON (Designs.parent_id = Models.id AND Designs.template_id = id шаблона дизайна модели) LEFT JOIN Resources AS Batches ON (Batches.parent_id = Designs.id AND Batches.template_id = id шаблона серии дизайна) WHERE Models.parent_id IS NULL AND Designs.id IS NOT NULL AND Batches.id IS NOT NULL |
SELECT * FROM Resources AS Models LEFT JOIN Resources AS Designs ON (Designs.parent_id = Models.id AND Designs.template_id = id шаблона дизайна модели) LEFT JOIN Resources AS Batches ON (Batches.parent_id = Designs.id AND Batches.template_id = id шаблона серии дизайна) WHERE Models.parent_id IS NULL AND Designs.id IS NOT NULL AND Batches.id IS NOT NULL
Теперь приклеивайте к этому запросу JOIN-ы из переменных.
- Вот зачем вы людей запутываете такими ответами?
Пусть открывает мануал, находит WITH RECURSIVE и получает иерархию любой вложенности.
- Ну в общем я так и начал сначала делать.
То есть чтобы добраться до строк из Variable_values нужно присоединить Template_variables, затем Variables и затем только Variable_values. Если сразу приджойнить таблицу Variable_values, то есть вероятность, что мы заберём те строки из Variables, которых нет в строках Template_variables.
Но такое количество джойнов, даже с LIMIT 10 выходит очень медленно. Либо я что-то не так делаю. Делаю везде LEFT JOIN. - Александр, В MySQL join реализован не таким образом как в других бд. Грубо говоря вместо слияния деревьями там внутри вложенные циклы. Добавляя каждый новый джойн ты увеличиваешь количество вложенных циклов. LIMIT тебе слабо поможет, т.к. сначала выполняется запрос и только после выполнения отбирается нужное количество строк. Я тебе оставил ссылку на доки с примерами, почитаешь, разберешься и сделаешь правильно.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для выполнения выборки данных из нескольких таблиц в MySQL можно использовать оператор JOIN. JOIN позволяет объединить данные из разных таблиц на основе определенного условия.
Вот пример запроса, который выбирает данные из двух таблиц "users" и "orders", где данные связаны по полю user_id:
SELECT users.*, orders.* FROM users JOIN orders ON users.user_id = orders.user_id;
В данном запросе мы выбираем все столбцы из таблицы "users" и "orders", где данные связаны по полю user_id. Если нужно выбрать определенные столбцы, их можно указать вместо символа "*".
Если нужно выполнить выборку из более чем двух таблиц, можно использовать несколько операторов JOIN. Например, если есть таблица "users", "orders" и "products", и их связь происходит по полям user_id и product_id, запрос будет выглядеть следующим образом:
SELECT users.*, orders.*, products.* FROM users JOIN orders ON users.user_id = orders.user_id JOIN products ON orders.product_id = products.product_id;
Таким образом, с помощью оператора JOIN можно объединять данные из нескольких таблиц и выполнять сложные выборки, учитывая связи между ними. Не забывайте указывать правильные условия объединения таблиц и выбирать только необходимые столбцы для оптимизации запроса.