使用哪种类型的连接?

8
我有一个核心表和三个以不同方式扩展“核心”表的表格。
我正在处理MLS数据,有一个包含所有mls列表通用信息的“常规”表格,然后是一个具有特定“住宅”信息的表格,一个用于“商业”,等等... 当我知道属性类型时,我一直在使用MLS编号来连接单个表格,但对于搜索,我想连接所有表格,并且可以使用特殊字段作为搜索条件(而不仅仅是搜索常规表格)。
哪种连接类型会给我一个数据集,其中将包含所有列表(包括idx表中的扩展字段)?
每个公共表记录都有一个在idx表中仅有一个相应记录。
                     ___________
                    |           |
                    |  COMMON   |
                    |           |
                    |___________|
                         _|_   
                          |
       ___________________|_____________________
     _|_                 _|_                   _|_
 _____|_____         _____|______           ____|______ 
|           |       |            |         |           |
|   IDX1    |       |   IDX2     |         |   IDX3    |
|           |       |            |         |           |
|___________|       |____________|         |___________|

1
通常搜索是为了模型编写的,但是视图可以用于展平模型...不管怎样,根据数据,可能是INNER(“正常”),但也可能是LEFT连接。这个问题对我来说没有多大意义——它太模糊了。 - user166390
你能发布表结构和所需输出的结构吗?此外,这些都是一对一的关系吗? - Oded
不知道我是否遗漏了什么,但MLS是什么? - alexn
@alexn 我猜是美国的 Major League Soccer(MLS);-) - user166390
MLS = “多重上市服务”,是一个集中的房地产列表系统。 - JNK
显示剩余4条评论
4个回答

6

如果您想让所有内容都在一行中显示,可以使用类似以下格式的方法。基本上,它会为您提供所有“常见”字段,然后是其他字段(如果有匹配项),否则为NULL

SELECT  Common.*,
        Idx1.*,
        Idx2.*,
        Idx3.*
FROM Common
LEFT JOIN Idx1
    ON Idx1.MLSKey = Common.MLSKey
LEFT JOIN Idx2
    ON Idx2.MLSKey = Common.MLSKey  
LEFT JOIN Idx3
    ON Idx3.MLSKey = Common.MLSKey

请记住,尽可能列出字段比使用SELECT *更好...
此外,我假设MySQL语法与我使用的SQL Server相同。

1
使用左(外)连接是关键,因为(内)连接由于原始问题中的数据描述而不返回任何行。 - Phil Helmer

0

我有一个类似的表格设置,其中表格“jobs”是核心表。

我有一个查询,从另外两个表中选择特定元素:

SELECT jobs.frequency, twitterdetails.accountname, feeds.feed
FROM jobs
JOIN twitterdetails ON twitterdetails.ID = jobs.accountID
JOIN feeds ON jobs.FeedID = feeds.FeedID 
WHERE jobs.username ='".$currentuser."';");

所以,正如您所看到的,没有特定的JOIN,但是链接字段已定义。您可能只需要为您的设置添加一个额外的JOIN行。


0

丑陋的解决方案/不成熟的尝试/可能误解了问题:

SELECT common.*,IDX1.field,NULL,NULL FROM COMMON 
LEFT JOIN IDX1 ON COMMON.ID = IDX1.ID
WHERE TYPE="RESIDENTIAL"
UNION ALL
SELECT common.*,NULL,IDX2.field,NULL FROM COMMON 
LEFT JOIN IDX2 ON COMMON.ID = IDX2.ID
WHERE TYPE="RESIDENTIAL"
UNION ALL
SELECT common.*,NULL,NULL,IDX3.field FROM COMMON
LEFT JOIN IDX3 ON COMMON.ID = IDX3.ID
WHERE TYPE="INDUSTRIAL"

0

Orbit已经接近。使用内连接而不是左连接。如果在idx中没有行,则不希望common出现在连接中。

假设每个common记录只能有1个idx表,您必须联合3个查询才能获得正确的结果。插入“NULL”以填充每个idx表缺少的列,以便它们可以联合。

顺便说一句,您的表设计很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接