1

私は3つのテーブルを持っています:

(ドメイン)

+----+-----+
| 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あなたのニーズは十分です。テーブルのフィールドの1つpricesNULL可能であり、他のテーブルに一致する行があるかどうかに関係なく、テーブルのすべてのレコードを表示する場合は、を使用しますLEFT JOIN

INNER JOIN、各テーブルに少なくとも1つの一致がある場合にのみレコードを表示します。一方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

2つのテーブルの積が必要なため、これを使用する必要がありますCROSS JOIN。これは、テーブルに挿入する必要があり、IDまたは列であると想定pricesIDますAUTO_INCREMENTed

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 に答える