0

SQL クエリの知識を深めようとしていますが、多対多のリレーションシップ クエリで行き詰っています。

PHP と MySQL データベース構造を使用すると、次のようになります。

データベース構造:

--------------------------------------------
|                  colour                  |
--------------------------------------------
| colour_id         |      colour          |
--------------------------------------------
| 1                 |      blue            |
--------------------------------------------
| 2                 |      red             |
--------------------------------------------
############################################
--------------------------------------------

.

-----------------------------------------------------------------
|   product_colours                                             |
-----------------------------------------------------------------
| id            |     product_id       |    colour_id           |
-----------------------------------------------------------------
| 1             |         1            |         2              |
-----------------------------------------------------------------
| 2             |         2            |         1              |
-----------------------------------------------------------------
#################################################################
-----------------------------------------------------------------

メインテーブル

-----------------------------------------------------------------
|   products                                                    |
-----------------------------------------------------------------
| id          |      name               |      details          |
-----------------------------------------------------------------
| 1           |      product 1          |      blah             |
-----------------------------------------------------------------
| 2           |      product 2          |      blah             |
-----------------------------------------------------------------
#################################################################
-----------------------------------------------------------------


-----------------------------------------------------------------
|    product_group_names                                        |
-----------------------------------------------------------------
| id            |      product_id         |    group_name_id    |
-----------------------------------------------------------------
| 1             |          1              |         1           |
-----------------------------------------------------------------
| 2             |          2              |         2           |
-----------------------------------------------------------------
#################################################################
-----------------------------------------------------------------


--------------------------------------------
|        group_name                        |
--------------------------------------------
| group_name_id     |      group_name      |
--------------------------------------------
| 1                 |  product_group_1     |
--------------------------------------------
| 2                 |  product_group_2     |
--------------------------------------------
############################################
--------------------------------------------

結合を使用して次のようなクエリを 1 つ記述できますSELECT * colours WHERE group_name = product_group_1か?

どんな助けでも素晴らしいでしょう。どうもありがとう。

4

1 に答える 1

2

確かにそれを行うためのクエリを書くことができます。基本的にテーブルを結合して、必要なデータをテーブルからテーブルにリンクし、必要な条件の where 句を追加できるようにする必要があります。

あなたの色は属性product_coloursを介してあなたに「リンク」されcolour_id、製品の色は両方のテーブルproduct_group_namesの属性を介してリンクされproduct_id、グループ名はテーブルのgroup_name_idおよびgroup_id属性を介してリンクされgroup_namesます。

ただし、この種のクエリを実行しているときに、これらのテーブルに多数のレコードがあると、クエリが非常に遅くなる可能性があります。JOIN...ON句だけでなく、句で参照される各列に必ずインデックスを追加する必要がありますWHERE

SELECT colour FROM colours c
JOIN product_colours pc ON c.id = pc.colour_id
JOIN product_group_names pgn ON pgn.product_id = pc.product_id
JOIN group_name gn ON gn.id = pgn.group_name_id
WHERE gn.group_name = "product_group_1"
于 2013-04-18T20:39:05.570 に答える