0

MySQL の知識と、データベース内のいくつかの異なるテーブル間で関係がどのように機能するかについての知識を深めようとしています。主キーと外部キー、およびそれらがテーブル内でどのように機能するかを理解しています。

私が持っているのは、私がいっぱい遊んでいるテストデータベースとpeoplehatsさまざまな帽子と人々の関係です。これまでにテストデータベースにあるものは次のとおりです。

| Tables_in_test  |
+-----------------+
| hats            |
| hats_collection |
| people          |
+-----------------+

peopleのテーブルは次のようになります。

+-----------+---------+
| person_id | fname   |
+-----------+---------+
|         1 | Sethen  |
|         2 | Michael |
|         3 | Jazmine |
+-----------+---------+

hatsのテーブルは次のようになります。

+--------+----------+
| hat_id | hat      |
+--------+----------+
|      1 | Awesome  |
|      2 | Kick Ass |
|      3 | Bowler   |
|      4 | Fedora   |
+--------+----------+

最後に、私のhats_collectionテーブルは次のようになります。

+-----------+--------+
| person_id | hat_id |
+-----------+--------+
|         2 |      1 |
|         2 |      4 |
|         3 |      2 |
+-----------+--------+

基本的に、私は hats テーブルに存在する可能性のあるさまざまな帽子をすべて格納し、 と を使用hats_collectionするだけのテーブルでさまざまな人々との関係を保持しています。person_idhat_id

これらすべてのテーブルを正しく設定してデータを挿入する方法は確かですが、hats_collectionテーブルからデータを表示してユーザー名とその帽子を表示するクエリを作成する方法がわかりません。

これが私がこれまでに持っているものです:

SELECT people.fname, hats.hat
FROM people
INNER JOIN hats
INNER JOIN hats_collection
ON hats_collection.person_id = people.person_id AND hats_collection.hat_id = hats.hat_id
WHERE people.person_id = 1;

これは空のセットを返しています。

私の質問は次のとおりです。

  1. どの人がどの帽子をかぶっているという正しい結果を得るには、クエリをどのように変更すればよいでしょうか?
  2. これは、このようなもののためにテーブルをセットアップする方法ですか? もっと簡単/効率的な方法はありますか?

編集

申し訳ありませんが、投稿したクエリは機能します。ID が 1 の人は帽子をかぶっていないため、空のセットが返されていましたが、これにより新しい質問が発生しました。

  1. これは、このクエリを記述する最良の方法ですか?

これを行うための最も効率的な方法についての私の質問はまだ残っています。

4

3 に答える 3

1

ON の基準は各結合にある必要があります。そうしないと、 people のすべてのレコードが hat のすべてのレコードにクロス結合されてしまいます。これは、望んでいたことではありません。

SELECT people.fname, hats.hat
FROM people
INNER JOIN hats_collection
  ON hats_collection.person_id = people.person_id 
INNER JOIN hats
  ON hats_collection.hat_id = hats.hat_id
WHERE people.person_id = 1;

テーブルは「通常/一般的な慣行」で設計されています

帽子の有無に関係なくすべての人が必要な場合は、LEFT JOIN上記のインナーの代わりに使用します。

于 2013-05-29T18:51:02.243 に答える