#mysql #sql #stored-procedures
#mysql #sql #хранимые процедуры
Вопрос:
Когда я запускаю хранимую процедуру ниже mysql, я получаю три разные таблицы в качестве выходных данных. Есть ли какой-либо способ объединить эти три таблицы и отобразить выходные данные как в одной таблице с разными столбцами и одной строкой?
CREATE DEFINER=`root`@`localhost` PROCEDURE `retrieveApplicantStatus`(IN in_userId INT)
BEGIN
SELECT applicants_id, approval FROM applicants WHERE users_id = in_userId;
SELECT pass_fail.result AS test_result, pass_fail.license_approval FROM pass_fail WHERE user_id = in_userId;
SELECT result AS trial_result FROM trial_result WHERE user_id = in_userId;
END
Требуемый вывод :
--------------------------------------------------------------------------
applicants_id | approval | test_result | trial_result | license_approval |
--------------------------------------------------------------------------
| | | | |
--------------------------------------------------------------------------
Комментарии:
1.
UNION ALL
? Если факт, если вы хотите установить одну строку, то все три текущих набора tow логически должны иметь одинаковую структуру2. СПАСИБО за ответ, позвольте мне посмотреть, как это выглядит!
3. Хорошо, продолжайте и посмотрите
4. Похоже ли, что он вернет один столбец?
5. @AlmaDo, я пробежал страницу, но это не то, что я хочу. Я хочу, чтобы из этой процедуры была одна строка и несколько столбцов. Есть ли способ?
Ответ №1:
Если user_id
ограничено, чтобы быть уникальным в каждой таблице, тогда вы можете использовать:
CREATE DEFINER=`root`@`localhost` PROCEDURE `retrieveApplicantStatus`(IN in_userId INT)
BEGIN
SELECT u.in_userId,
a.applicants_id,
a.approval,
pf.result AS test_result,
pf.license_approval,
tr.result AS trial_result
FROM (SELECT in_userId) AS u
LEFT JOIN applicants AS a
ON a.users_id = u.in_userId
LEFT JOIN pass_fail AS pf
ON pf.user_id = u.in_userId
LEFT JOIN trial_result AS tr
ON tr.user_id = u.in_userId;
END
ОДНАКО, если он не ограничен уникальностью, это даст вам декартово произведение, т.Е. 2 строки в каждой таблице дадут вам всего 8 строк, 3 строки в каждой таблице дадут вам 27 результатов.
Ответ №2:
Попробуйте использовать следующий код:-
BEGIN
SELECT applicants_id, approval
FROM applicants WHERE users_id = in_userId;
UNIION ALL
SELECT pass_fail.result AS test_result, pass_fail.license_approval
FROM pass_fail
WHERE user_id = in_userId;
UNION ALL
SELECT result AS trial_result
FROM trial_result
WHERE user_id = in_userId;
END
Комментарии:
1. Вздох , пожалуйста, хотя бы попробуйте свой код. Она даже не будет выполнена из-за разного количества столбцов в наборах строк
2. Но, насколько я понимаю, если мы хотим выбрать несколько столбцов из нескольких таблиц, тогда мы должны использовать
UNION ALL
предложение, как и я.3. Да, и, насколько я вижу, у вас много ошибок в вашем коде: разное количество столбцов для ОБЪЕДИНЕНИЯ, использование разделителя sql внутри запроса, смешивание псевдонимов для столбца и таблицы и т. Д. Это не то, что должно быть ответом на SO. Ответы должны быть проверены и после этого — опубликованы со всеми необходимыми пояснениями.
4. Ну, я просто пытался рассказать логику лучше, чем рассказывать весь код, как ложкой, вот почему я не тестировал код. Но все же мне нужно оправдание, если что-то пошло не так.