Я пытаюсь получить данные из двух связанных таблиц с помощью внешнего ключа и сохранить данные в виде отдельных записей/объектов.
Лучшее решение, которое я нашел до сих пор, — это использование JOIN с префиксом столбца, чтобы различать две таблицы.
SELECT
tableA.method AS tableA_method,
tableB.primitiveType AS tableB_primitiveType
FROM tableB
JOIN tableA ON tableB.tableA_id = tableA.id
WHERE tableB.id = ?
Это работает, но означает, что я должен разделить данные после завершения запроса. Есть ли способ выполнить один запрос SQL, который возвращает отдельные записи для данных каждой таблицы?
Текущий результат: один объект/RowDataPacket со столбцами из обеих таблиц.
[ RowDataPacket { tableA_method: "some value", tableB_primitiveType: "some value }]
Желаемый результат: два объекта, по одному на каждую таблицу
[ RowDataPacket { method: "some value" }, RowDataPacket { primitiveType: "some value" }]
или
[ RowDataPacket { tableA: { method: "some value" }, tableB: { primitiveType: "some value }}]
Я изучил подзапросы, но они включают несколько запросов и могут быть не самым эффективным решением.
@Silvan: я внес уточнение в вопрос.
Насколько я знаю, один оператор SELECT может вернуть только один набор результатов. Однако хранимая процедура может возвращать несколько наборов результатов, так что вы можете изучить это.
Пожалуйста, покажите как образцы данных, так и ожидаемый результат
@ДжонасМецлер. Я уточнил ожидаемый результат.


То, что вы хотите, имеет смысл только в том случае, если две таблицы имеют один и тот же столбец. Допустим, у tableA есть имя столбца и tableB. Теперь вы можете ПРИСОЕДИНИТЬСЯ к ним, но тогда вы получите 2 столбца. Если вы хотите «объединить» набор результатов, вы можете использовать UNION.
SELECT name FROM tableA
UNION
SELECT name FROM tableB
Один оператор SELECT не может возвращать разные наборы результатов из разных таблиц. Но зачем это делать? Вы можете просто запустить 2 разных SELECTS.
Спасибо @Сильван. Меня не интересует объединение данных из двух таблиц. Я просто хотел знать, можете ли вы получить два объекта (по одному для каждой таблицы) из одного запроса. Поскольку внешний ключ позволяет вам получить данные в одном объекте, размещение их в двух отдельных объектах казалось всего лишь небольшим шагом оттуда. Но я понял из вашего ответа, что это на самом деле невозможно.
Я не знаю, насколько вы опытны в SQL, потому что меня немного беспокоит использование слова объект в ваших текстах. SQL работает не с «объектами», а с таблицами. И в результате получается своего рода таблица. В таблице каждая строка должна иметь одинаковое количество столбцов.
У меня очень ограниченный опыт! Когда я говорю «объект», я имею в виду RowDataPacket в результате запроса. Это могло бы выглядеть так: [RowDataPacket { tableA_method: "некоторое значение", tableB_primitiveType: "некоторое значение}]. Я надеялся, что вы могли бы получить что-то вроде: значение" }] или это: [ RowDataPacket { tableA: { метод: "некоторое значение" }, tableB: { примитивный тип: "некоторое значение }}]
Да это невозможно. Вы должны запустить 2 разных запроса. Если вы хотите понять, почему попробуйте написать SQL внутри инструмента SQL, такого как DataSpell или какой-либо другой инструмент. Вы довольно быстро освоитесь!
Ладно, это то, что есть. Я надеюсь, что это так!
Вы можете настроить хранимую процедуру для выполнения двух запросов за один раз.
Настраивать:
DELIMITER // ;
CREATE PROCEDURE myProcedure (IN tableB_id INT)
BEGIN
SELECT tableA.*
FROM tableA
INNER JOIN tableB ON tableA.id = tableB.tableA_id
WHERE tableB.id = tableB_id;
SELECT tableB.*
FROM tableB
WHERE tableB.id = tableB_id;
END//
DELIMITER ;
Затем, когда вы хотите вернуть два набора результатов одним вызовом, например, для идентификатора 123, вы можете использовать:
CALL myProcedure(123);
Спасибо @RobEyre! Это не совсем то, на что я рассчитывал, но все же попробую.
Не могли бы вы объяснить немного больше? Что вы имеете в виду под «хранить данные как отдельные записи/объекты»? Может быть, результат сейчас и результат, который вы хотите, также помогут