1

と の 2 つのテーブルが UsersありCarsます。テーブルは 3 番目のテーブルに結合されます: Users_Cars_Join

結合するステートメントを使用せずに、これをもう一度使用して結合するよりも、両方のテーブル ( CarsUsers)からデータを選択する高速な (直接的な) 方法はありますか?'inner join'UsersUsers_Cars_JoinUsers_Cars_joinCars

どのように正しく専門的に行うべきなのだろうか。

車:

  • ID
  • 名前

ユーザー:

  • ID
  • 名前

Users_Cars_Join:

  • ID
  • ユーザーID
  • 車ID
4

2 に答える 2

2

リンクテーブルをバイパスする方法はありませんが、常に結合を書くのが怖い場合は、それを行うビューを作成できます

CREATE VIEW UsersCars AS 
SELECT  c.ID AS CarID
        , c.Name AS CarName
        , u.ID AS UserID
        , u.Name AS UserName
FROM    Cars c
        INNER JOIN Users_Cars_Join ucj ON ucj.CarID = c.ID
        INNER JOIN Users u ON u.ID = ucj.UserID

ビューの使用は次のように簡単です

SELECT * FROM UsersCars

デモについては、このSQL Fiddleを参照してください

于 2013-03-28T07:12:37.330 に答える
1

次のようにテーブルを結合するために古いスタイルを使用できます。

SELECT c.id, c.name, u.id, u.name, ...
  FROM cars c, users u, user_cars_join uc
 WHERE u.id = uc.userid
   AND c.id = uc.carid

注意事項:

  1. テーブルが存在するのuser_cars_joinは、ユーザーとその車の間の多対多の関係を表すためです。このテーブルを構造から削除すると、userscarsテーブルは関連付けられなくなります。

  2. 1 対 1、1 対多、多対多の関係の現象を理解する必要があります。

    • 1 対 1 の関係とは、1 つのセット内の 1 つのエンティティが、もう 1 つのセット内の 1 つのエンティティのみに関連付けられる関係です。あなたの場合、1 人のユーザーが 1 台の車しか所有していなかったため、実用的ではありません。1 人で複数の車を所有できます。

    • 1 対多の関係とは、1 つのセット内の 1 つのエンティティが別のセット内の複数のエンティティに関連付けられ、別のセット内の 1 つのエンティティが最初のセット内の 1 つのエンティティのみに関連付けられる関係です。あなたの場合、1 人のユーザーが複数の車を所有していましたが、1 台の車は 1 人のユーザーが所有していました。特に車に登録番号がある場合は、このような関係を持つことができます。スキーマは次のようになります。

      User (userid, name)
      car_sales (carid, userid, registration_number)
      Car (carid, name, brand, model)
      

      userid表の は、car_salesこの車を所有しているユーザーを示していることに注意してください。また、caridインテーブルとは、ユニークインcar_salesテーブルを指します。caridcar

      また、このモデルでは、1 人のユーザーが複数の車を所有できることに注意してください。1 つのモデルの自動車に複数のインスタンス (そのアイテム) を複数のユーザーに販売することができます。

      これは、これらの関係を表すために最も広く使用され、受け入れられているモデルです。

    • あなたの例で実装されているように、多対多の関係は、あるセットの複数のエンティティが他のセットの複数のエンティティに関連している場合、およびその逆の場合です。エンティティ間の関係を示すには、別の関係テーブルが必要です。あなたの場合はuser_car_joinテーブルです。

于 2013-03-28T07:05:38.737 に答える