使用LEFT JOIN仅选择一个连接的行

时间:2010-03-24 18:22:39

标签: sql mysql

我正在尝试LEFT JOIN两个表,以获取TABLE_1中所有行的列表以及TABLE_2中的一个相关行。我尝试过LEFT JOIN和GROUP BY c_id,但是我不想将TABLE_2中的相关行按isHeadOffice DESC排序。

以下是一些示例表

TABLE 1
c_id    Name
----------------
1       USA
2       Canada
3       England
4       France
5       Spain

TABLE2
o_id    c_id    Office              isHeadOffice
------------------------------------------------
1       1       New York            1
2       1       Washington          0
3       1       Boston              0
4       2       Toronto             0
5       3       London              0       
6       3       Manchester          1
7       4       Paris               1
8       4       Lyon                0

所以我想从中得到的东西就像:

RESULTS
c_id    Name        Office
----------------------------
1       USA         New York
2       Canada      Toronto
3       England     Manchester
4       France      Paris
5       Spain       NULL

我正在使用PHP& MySQL的。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

SELECT  *
FROM    table1 t1
LEFT JOIN
        table2
ON      o.id = 
        (
        SELECT  o_id
        FROM    table2 t2
        WHERE   t2.c_id = t1.c_id
        ORDER BY
                t2.c_id DESC, t2.isHeadOffice DESC, t2.o_id DESC
        LIMIT 1
        )

table2 (c_id, isHeadOffice, o_id)上创建一个索引,以便快速工作。

子查询中的ORDER BY子句可能看似多余,但MySQL需要选择正确的索引。

答案 1 :(得分:0)

为什么不:

SELECT c_id, name, 
(SELECT t2.office 
 FROM table2 t2 
 WHERE t2.c_id = t1.c_id AND t2.isHeadOffice = 1
 LIMIT 1) office
FROM table1 t1
ORDER BY 3 DESC

答案 2 :(得分:0)

这假设您的isHeadOffice是一个位字段,每个国家/地区只有一个总部。

SELECT
    Table1.c_id,
    Table1.Name,
    Table2.Office
FROM
    Table1
LEFT OUTER JOIN
    Table2
ON
    Table1.c_id = Table2.c_id
AND
    Table2.isHeadOffice = 1