【发布时间】:2014-05-29 17:11:25
【问题描述】:
我对 MySQL 在这么多年后仍然不支持 FULL JOIN 感到非常失望(为什么?)并且我必须使用 UNION 作为解决方法。说我在以下查询中遇到问题。我有两个表作为例子:
计算机
id userid owner cpu
1 1 Jack 3.4
2 1 Jack 3.4
3 2 Sara 3.0
监视器
id userid owner inch
1 1 Jack 22
2 1 Jack 22
3 3 Mark 17
4 4 Luke 32
基本上,我有一个已分配给所有者的具有规格的计算机列表。同样,我有一个带有规格的监视器列表,每个监视器都分配给一个所有者。我想按所有者将这两个表组合成这个结果:
id userid owner cpu id userid owner inch
1 1 Jack 3.4 1 1 Jack 22
2 1 Jack 3.4 2 1 Jack 22
3 2 Sara 3.0 null null null null
null null null null 3 3 Mark 17
null null null null 4 4 Luke 32
我可以通过这个查询成功得到上面的结果:
SELECT * FROM computers AS a
LEFT OUTER JOIN monitors AS o on a.owner = o.owner
UNION
SELECT * FROM computers AS a
RIGHT OUTER JOIN monitors AS o on a.owner = o.owner
问题是:
- 我不想在我的查询中使用 jolly 字符,不仅因为它效率不高,而且因为我只需要一些特定的列而不是全部
- 两个表都有不明确的列名(id、userid、owner),例如,我似乎不能按所有者排序。我知道我应该使用别名,但我不明白如何实现它
- 我必须使用 WHERE 语句,但由于列名不明确,我不明白如何实现它
现在总结一下我在伪查询中所说的话:
选择 id 作为 a_id,用户 ID 作为 a_userid,所有者作为 a_owner 但不是 cpu 来自 cpu = 3.4 的计算机
由所有者联合和加入:
SELECT id AS b_id, userid AS b_userid, owner AS b_owner, inch AS b_inch FROM monitor WHERE inch = 22
感谢您的宝贵时间。
【问题讨论】:
-
我想知道这有多少只是一个虚构的例子,有多少不是。数据库设计很糟糕,每条记录中都重复了用户 ID 和名称。然后,您将一个人拥有的所有计算机和监视器组合在一起。做什么的?查看所有有趣的可能组合?使用给定的查询,您不会得到两个 Jack 记录,而是四个。至于不明确的列名:它们需要一个限定符。您已经在 a.owner = o.owner 中使用了它。那么问题出在哪里?
-
我已经说过我的只是一个例子。当我说你有这样的结构时,相信我。如果您认为设计不好,那么您必须责怪whmcs.com。无论如何相信我。设计绝对好,功能齐全。这里的重点不是讨论设计的好坏,而是如何进行 FULL JOIN。
-
好的。有时这样的旁白是有帮助的。我不是故意攻击:-) 我已经发布了一个答案。希望它能回答你所有的问题。
标签: mysql sql select join union