1

我有三张桌子:

(域)

+----+-----+
| 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       |
+----+------+--------+

但事实并非如此。

4

2 回答 2

5

一个INNER JOIN就可以满足你的需要。如果表上的一个字段可以prices,并且您想显示表上的所有记录,无论它在另一个表上是否有匹配的行,请使用LEFT JOIN.

INNER JOIN只有在每个表上至少有一个匹配项时才会显示该记录。LEFT JOIN另一方面,while将在左侧显示所有行,无论它在其他表上匹配还是不匹配。

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并且IDIdentity或者AUTO_INCREMENTedcolumn,

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

如果ID表中的价格列不是 auto_incremented 并且您正在使用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
于 2013-03-09T14:26:48.937 回答
0

只需将DOMAINSSLABS表交叉连接即可。不确定为什么 PRICES 表在这里起作用,因为您只想将 DOMAINS 表中的行与 SLABS 表中的行置换。

于 2013-03-09T14:56:05.903 回答