У меня есть несколько таблиц с разными номерами и типами столбцов и один столбец.Как объединить результаты из нескольких таблиц с разными столбцами?
+--------+---------+------------+-------------+
| person | beardID | beardStyle | beardLength |
+--------+---------+------------+-------------+
+--------+-------------+----------------+
| person | moustacheID | moustacheStyle |
+--------+-------------+----------------+
Я хочу получить все результаты, соответствующие заданному значению общего столбца. Я могу сделать это с помощью нескольких операторов выбора, как это:
SELECT * FROM beards WHERE person = "bob"
и
SELECT * FROM moustaches WHERE person = "bob"
Но это требует несколько вызовов API MySQL, что представляется неэффективным. Я надеялся, что смогу использовать UNION ALL, чтобы получить все результаты в одном вызове API, но UNION требует, чтобы таблицы имели одинаковый номер и аналогичный тип столбцов. Я мог бы написать инструкцию SELECT, которая вручную помещала бы результаты из каждой таблицы, добавляя столбцы с значениями NULL, но это быстро стало бы неуправляемым для нескольких таблиц с несколькими столбцами.
Я ищу результирующий набор примерно так:
+--------+---------+------------+-------------+-------------+----------------+
| person | beardID | beardStyle | beardLength | moustacheID | moustacheStyle |
+--------+---------+------------+-------------+-------------+----------------+
| bob | 1 | rasputin | 1 | | |
+--------+---------+------------+-------------+-------------+----------------+
| bob | 2 | samson | 12 | | |
+--------+---------+------------+-------------+-------------+----------------+
| bob | | | | 1 | fu manchu |
+--------+---------+------------+-------------+-------------+----------------+
Есть ли способ для достижения этой цели, что быстро и ремонтопригодны? Или мне лучше запускать отдельный запрос для каждой таблицы?
Разъяснение:
Я не ищу декартово произведение. Мне не нужна строка для каждой комбинации бород и усов, мне нужна строка для каждой бороды и строки для каждого уса.
Так что, если есть 3 соответсвующей бороды и 2 соответсвующих усов я должен получить 5 строк, а не 6.
Хотя это можно сделать в большинстве баз данных с помощью «ПОЛНОГО ПРИСОЕДИНЯЯ», а в MySQL с обходным решением ITroubs я серьезно сомневаюсь в том, есть ли какое-либо существенное увеличение производительности от этого, и вы, вероятно, только создаете беспорядок неясного кода, ваш преемник не поблагодарит вас. Четкий и точный код перевешивает прирост производительности при очень низких процентах в большинстве случаев. – Wrikken