Mysql嵌套选择多个连接与连接表上的条件

时间:2014-12-11 07:57:18

标签: mysql join nested where

对于分页Tableview,我有一个带有多个JOINS的SELECT。一般来说,这适用于未经过滤的结果。

查询如下所示:

SELECT seltable.*, 
       tbl2.name AS tbl2name, 
       tbl3.name AS tbl3name, 
       tbl4.name AS tbl4name 
FROM
       ( SELECT * FROM selecttable 
         WHERE value = 99 
         ORDER BY datetime DESC 
         LIMIT 50 OFFSET 0 ) 
       AS seltable
LEFT JOIN table1 AS tbl1 ON seltable.tbl1_uid = tbl1.uid
LEFT JOIN table2 AS tbl2 ON tbl1.tbl2_uid = tbl2.uid
LEFT JOIN table3 AS tbl3 ON tbl2.tbl3_uid = tbl3.uid
LEFT JOIN table4 AS tbl4 ON tbl3.tbl4_uid = tbl4.uid;

现在我不知道如何使用与其中一个连接表相关的条件来完成过滤结果。

当我刚设置:

LEFT JOIN tablex AS table ON foreign_table.tblx_uid = table.uid AND {condition}

这个条件只涉及嵌套SELECT的50个结果。

在这种情况下,有没有办法在JOIN表上使用WHERE子句?

有关示例数据,请参阅http://sqlfiddle.com/#!2/fad4d/2

预期结果:

  • 将x队记录限制在5个团队uid中,其中Tournament2是该团队的相关比赛之一。

祝你好运 w1ll1

1 个答案:

答案 0 :(得分:0)

尝试不控制该子查询中的分页,而只是使用复合where子句的更传统的查询。但是,因为您正在使用左连接,请注意通过where子句添加过滤器,该子句将覆盖外连接以产生内连接的效果。

SELECT seltable.*, 
       tbl2.name AS tbl2name, 
       tbl3.name AS tbl3name, 
       tbl4.name AS tbl4name 
FROM selecttable AS seltable
LEFT JOIN table1 AS tbl1 ON seltable.tbl1_uid = tbl1.uid
LEFT JOIN table2 AS tbl2 ON tbl1.tbl2_uid = tbl2.uid
LEFT JOIN table3 AS tbl3 ON tbl2.tbl3_uid = tbl3.uid
LEFT JOIN table4 AS tbl4 ON tbl3.tbl4_uid = tbl4.uid
WHERE seltable.value = 99 
...
ORDER BY seltable.datetime DESC 
LIMIT 50 OFFSET 0 

或者使用更多子查询,如下所示:

SELECT seltable.*, 
       tbl2.name AS tbl2name, 
       tbl3.name AS tbl3name, 
       tbl4.name AS tbl4name 
FROM
       ( SELECT * FROM selecttable 
         WHERE value = 99 
         ORDER BY datetime DESC 
         LIMIT 50 OFFSET 0 ) 
       AS seltable
LEFT JOIN ( SELECT uid, name
            FROM table1
            WHERE 1=1 -- amend to suit
            ) AS tbl1 ON seltable.tbl1_uid = tbl1.uid
LEFT JOIN ( SELECT uid, name
            FROM table2
            WHERE 1=1 -- amend to suit
            ) AS tbl2 ON tbl1.tbl2_uid = tbl2.uid
LEFT JOIN ( SELECT uid, name
            FROM table3
            WHERE 1=1 -- amend to suit
            ) AS tbl3 ON tbl2.tbl3_uid = tbl3.uid
LEFT JOIN ( SELECT uid, name
            FROM table4
            WHERE 1=1 -- amend to suit
            ) AS tbl4 ON tbl3.tbl4_uid = tbl4.uid;

这是另一种尝试,基于你的sqlfiddle,似乎可以使用INNER JOINS:

SELECT theteam.*, 
       trnmnt.name AS tournamentname, 
       cat.name AS categoryname, 
       sport.name AS sportname 
FROM ( 
  SELECT * FROM team 
  ORDER BY team.name ASC ) 
AS theteam 
INNER JOIN tournament_team AS tntm ON tntm.team_uid = theteam.uid 
INNER JOIN tournament AS trnmnt ON tntm.tournament_uid = trnmnt.uid AND trnmnt.name = 'Tournament2'
INNER JOIN category AS cat ON trnmnt.category_uid = cat.uid 
INNER JOIN sport ON cat.sport_uid = sport.uid
LIMIT 5 OFFSET 0
;

该查询的结果是:

| UID |   NAME | TOURNAMENTNAME | CATEGORYNAME | SPORTNAME |
|-----|--------|----------------|--------------|-----------|
|   2 | Team02 |    Tournament2 |      Germany |    Soccer |
|   3 | Team03 |    Tournament2 |      Germany |    Soccer |
|   4 | Team04 |    Tournament2 |      Germany |    Soccer |
|   5 | Team05 |    Tournament2 |      Germany |    Soccer |
|   6 | Team06 |    Tournament2 |      Germany |    Soccer |