MySQL:在一个查询中从四个不同的表中选择结果


MySQL : SELECT results from four different tables in one query

我有四个不同的表,一个主SPECIAL表只包含引用CONTRACTPHONE表的id。

我的查询如下:

SELECT *
FROM `specials` specials
INNER JOIN `contract` contracts
ON  specials.contract_id = contracts.id
INNER JOIN `phone` phones
ON specials.phone_id = phones.id
INNER JOIN `ugets` ugets
ON specials.id = ugets.special_id

目前,它只从UGETS表中获得一行,但我需要该特定表中具有正确special_id的所有行。

有人能给我指正确的方向吗?我似乎忍不住用谷歌搜索它。

INNER JOIN只返回两个联接表中至少有一个匹配项可用的行。问题是你把4张桌子连在一起。因此,如果你只使用ugets加入特价,可能会有更多的记录(超过1),但如果你与其他表一起加入,这些记录会被过滤掉。

如果没有必要为电话或合同中的每个特价条目都有一个现有记录,那么将这两个表的联接类型更改为左联接。(正如比齐克洛普博士的评论所暗示的那样)

通常,您应该考虑哪些联接数据是可选的,哪些是必需的。示例查询需要表的所有数据。也许这不是你想要的。

您的查询看起来大致正确,除非您还想要所有行,而不管是否存在contractphone。在这种情况下,您将希望使用OUTER JOINLEFT JOIN而不是INNER JOIN:

SELECT *
FROM `specials` specials
LEFT JOIN `contract` contracts
ON  specials.contract_id = contracts.id
LEFT JOIN `phone` phones
ON specials.phone_id = phones.id
LEFT JOIN `ugets` ugets
ON specials.id = ugets.special_id

没有特定特殊记录的表中的字段将使用NULL返回,但匹配表中的所有行都将显示。

请注意,这可能会对性能产生不利影响(可能会使在一个查询中获得所有四个表的好处付诸东流)-您应该评估收益与成本,看看是否仍然需要一个查询。

作为LEFT JOINing的替代方案,您可以考虑使用UNION ALL来连接三个查询的结果,每个查询内部都将specials表连接到其他三个表中的一个。

这将确保对于specials表上的每一行只返回n(1)+n(2)+n。