使用什么类型的Join?

时间:2011-03-03 20:59:52

标签: mysql sql database join

我有一个核心表和3个以不同方式扩展'核心'表的表。

我正在处理MLS数据,我有一个'通用'表,其中包含所有mls列表共有的信息,然后是一个具有特定“住宅”信息的表,一个用于“商业”等等...我有当我知道属性类型已知时,我知道列表时使用mls数来连接单个表,但是对于搜索我想加入所有这些并且具有可用于搜索条件的特殊字段(不仅仅是搜索公用表)。 / p>

什么类型的连接会为我提供一个包含所有列表的数据集(包括idx表中的扩展字段)?

对于每个Common表记录,在 ONLY ONE 的idx表中都有一条相应的记录。

                     ___________
                    |           |
                    |  COMMON   |
                    |           |
                    |___________|
                         _|_   
                          |
       ___________________|_____________________
     _|_                 _|_                   _|_
 _____|_____         _____|______           ____|______ 
|           |       |            |         |           |
|   IDX1    |       |   IDX2     |         |   IDX3    |
|           |       |            |         |           |
|___________|       |____________|         |___________|

4 个答案:

答案 0 :(得分: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 :(得分:0)

我有一个类似的表格,其中“作业”表是核心表。

我有这个查询从其他两个表中选择某些元素:

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行来设置。

答案 2 :(得分: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"

答案 3 :(得分:0)

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

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

BTW你的桌子设计很好。