【发布时间】:2011-04-30 22:39:49
【问题描述】:
我有几张表,它们的列数和类型各不相同,并且有一个共同的列。
+--------+---------+------------+-------------+
| person | beardID | beardStyle | beardLength |
+--------+---------+------------+-------------+
+--------+-------------+----------------+
| person | moustacheID | moustacheStyle |
+--------+-------------+----------------+
我想获取与共享列的给定值匹配的所有结果。我可以使用多个这样的选择语句来做到这一点:
SELECT * FROM beards WHERE person = "bob"
和
SELECT * FROM moustaches WHERE person = "bob"
但这需要多次mysql API调用,看起来效率低下。我希望我可以使用 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 行。
【问题讨论】:
-
虽然它可以在大多数数据库中使用
FULL JOIN完成,并且在 MySQL 中使用 ITroubs 的解决方法,但我严重怀疑这是否会带来任何显着的性能提升,而你是可能只会创建一堆你的继任者不会感谢你的晦涩代码。在大多数情况下,在非常低的百分比下,清晰准确的代码胜过性能提升。