MySQL LEFT RIGHT JOIN语法流畅

时间:2011-10-19 19:03:53

标签: mysql

我遇到这种情况很多,我将有一个查询,在连接条件下需要一个表,可能没有条目,因此要求我使用LEFT JOIN。当它与多于1个连接一起使用时,我无法理解语法。

我会:

SELECT A.*, B.*, C.*
FROM A, B, C
WHERE A.id = C.id
AND C.aid = A.id
AND B.cid = C.id

随着D的出现可能会变空,我必须重写查询并遇到问题。

如何简单地将D加入这些表中的任何一个?

4 个答案:

答案 0 :(得分:5)

明确指定所有JOIN会更好。这应该会让事情变得更加清晰。

SELECT A.*, B.*, C.*, D.*
    FROM A
        INNER JOIN C
            ON C.aid = A.id
        INNER JOIN B
            ON B.cid = C.id
        LEFT JOIN D
            ON C.did = d.id

答案 1 :(得分:1)

以下语法可以帮助您。基本前提是列出的任何表都是必需的LEFT。右边的表(或别名)是可选的。我知道你不太明白,你的语法样本显示(不是要批评),因为你从A加入 - > C和C在不同的字段上回到A.如果在“C”表中两个字段同时指向A的情况下,您将重新加入A作为第二个别名......

select 
      Want.*,
      Maybe.*,
      SecondA.*,
      B.*
   From
      A as Want
         LEFT JOIN C as Maybe
            on Want.ID = Maybe.ID

            JOIN A as SecondA
               on Maybe.AID = SecondA.ID
            JOIN B
               on Maybe.ID = B.cID

所以,这个查询表明我想要表A中的所有内容(别名旺旺 - 列表中的左侧/第一个表)无论表C中是否存在匹配(别名为Maybe)ID ID匹配。

注意下一个连接从“C”返回到“A”和表B的第二个实例。我将这些连接作为连接...所以“Maybe”别名和第二个实例之间的关系“A”和“B”是JOIN(必填)。

希望这可以更好地澄清它是如何工作的。

现在,为您的现实生活中的查询。如果您可以描述您正在寻找的内容,以及您的样本表结构/结果预测,那么列表可以为您的需求提供更明确的解决方案。

答案 2 :(得分:1)

我的建议是永远不要在FROM子句上指定多个列。

为清楚起见,总是最好:

  • 使用JOIN条款
  • 使用别名
  • 在等号左侧指定已连接表的列

示例:

SELECT a.*, b.*, c.*
FROM ATable a
INNER JOIN BTable b
  ON b.id = a.id
INNER JOIN CTable c
  ON c.id = a.id
WHERE a.someColumn = 'something'

不确定MySQL,但在其他一些SQL版本中,您可以在UPDATES和DELETES上使用相同的内容,例如:

DELETE FROM a
FROM ATable a
INNER JOIN BTable b
  ON b.id = a.id
INNER JOIN CTable c
  ON c.id = a.id
WHERE a.someColumn = 'something'

UPDATE a
SET  something = newValue
FROM ATable a
INNER JOIN BTable b
  ON b.id = a.id
INNER JOIN CTable c
  ON c.id = a.id
WHERE a.someColumn = 'something'

答案 3 :(得分:-1)

希望这会有所帮助

SELECT 
A.*, B.*, C.*
FROM A
inner join C on(A.id = C.id)
inner join B on(B.cid = C.id)