如何连接三个表来查看所有行

时间:2013-03-09 14:24:07

标签: mysql sql

我有三张桌子:

(结构域)

+----+-----+
| id |title|
+----+-----+
| 1  | com |
+----+-----+
| 2  | net |
+----+-----+

(板坯)

+----+-----+
| id |title|
+----+-----+
| 1  |str1 |
+----+-----+
| 2  |str2 |
+----+-----+

(价格)

+----+------+--------+
| id |slabid|domainId|
+----+------+--------+
empty

这是我的查询:

SELECT
  prices.*, 
FROM
  prices 
  RIGHT JOIN domains ON domains.id=prices.domainId
  JOIN slabs ON slabs.id=prices.slabId

我应该如何通过域名和列表进行查询?平板行...

,结果应该是这样的:

+----+------+--------+
| id |slabid|domainId|
+----+------+--------+
| 1  |1     |1       |
+----+------+--------+
| 2  |2     |1       |
+----+------+--------+
| 3  |1     |2       |
+----+------+--------+
| 4  |2     |2       |
+----+------+--------+

但事实并非如此。

2 个答案:

答案 0 :(得分:5)

INNER JOIN足以满足您的需求。如果表prices上的某个字段是 nullable ,并且您希望在表上显示所有记录是否在另一个表上有匹配的行,请使用LEFT JOIN

INNER JOIN只会在每张桌子上至少有一个匹配时显示记录。而另一方面,LEFT JOIN将显示左侧上的所有行,无论其他表上是否匹配或匹配。

SELECT  a.*,
        b.title domainTitle,
        c.title slabsTitle
FROM    prices a
        INNER JOIN domain b
            ON a.domainID = b.id
        INNER JOIN slab c
            ON a.slabID = c.ID

要进一步了解联接,请访问以下链接:

更新1

您需要使用CROSS JOIN,因为您需要两个表的产品,假设您要将其插入表prices并且ID Identity < / em>或AUTO_INCREMENTed列,

INSERT INTO prices (slabid, domainid)
SELECT  b.ID as slabID, a.ID as domanID
FROM    domains a
        CROSS JOIN slabs b

如果表格价格上的列ID未自动增加且您使用的是mysql,请使用变量来保持值的增量,

SELECT  @ID:=@ID+1 ID,
        b.ID as slabID, 
        a.ID as domanID
FROM    domains a
        CROSS JOIN slabs b
        CROSS JOIN (SELECT @ID:=0) s

答案 1 :(得分:0)

只需与 SLABS 表交叉加入 DOMAINS 即可。不知道为什么PRICES表在这里起作用,因为你只想用DOMABS表中的行来排列DOMAINS表中的行。