nrr06402
@nrr06402

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

著者は何を言いたいのでしょうか?

Q&A

Closed

これは「phpMyAdmin」~の「MySQ」L関連の質問です。
mysql> select * from my_items;
+----+----------+--------------+-------+----------------------+-------+---------------------+
| id | maker_id | item_name | price | keyword | sales | created |
+----+----------+--------------+-------+----------------------+-------+---------------------+
| 1 | 1 | いちご | 180 | 赤い,甘い,ケーキ | 5 | 2018-01-01 00:00:00 |
| 2 | 2 | りんご | 90 | 丸い,赤い,パイ | 20 | 2023-01-11 06:57:21 |
| 3 | 1 | バナナ | 120 | パック,甘い,黄色 | 16 | 0000-00-00 00:00:00 |
| 4 | 3 | ブルーベリー | 200 | 袋入り,青い,眼精疲労 | 8 | 0000-00-00 00:00:00 |
+----+----------+--------------+-------+----------------------+-------+---------------------+
4 rows in set (0.01 sec)
以上ですが
分かりにくいで、上記と同じ「添付画像」で問題の表の確認ができます。

さて
書籍P.179「よくわかるPHP教科書()PHP第7対応版」
3)複数のテーブルを横断して検索する
ではこの状態で「いちご生産者」を知るにはどうした良いのでしょう?
このとき、通常の手順にしてとしては次のようになります。
❶次のSQLを発行して商品1の情報を取り出します。
(「phpMyAdmin」の「SQL」に以下を入力しましす。)

01 SELECT maker_id FROM my_items WHERE id=1
結果次です

クエリボックスを表示
Current selection does not contain a unique column. Grid edit, checkbox, Edit, Copy and Delete features are not available. ドキュメント
行 0 - 0 の表示 (合計 1, Query took 0.0003 seconds.)
SELECT maker_id FROM my_items WHERE id=1
maker_id
1

❷このデータ「maker_id」を見て、1であることを知ります。

❸次SQLを発行して、生産の情報を検索します。
(P.180)
01 SELECT * FROM my_items Where id=1;
❹こうして山田さんであることを知ることができます。(図4-18-7)。
id name address tel
1 山田さん 東京都港区 000-111-2222
しかし、これは非常に効率が悪いです。そこで、データベースは非常に便利な
機能があります。それがリレーションです。

リレーションを使う ・・・
ELECT * FROM makers, my_items WHERE my_items.id=1 and makers.id=my_items.maker_id

SELECT * FROM makers,テーブル名makersに問合わせします。
id maker_id name address tel id maker_id item_name price keyword sales created
1 0 山田さん 東京都港区 000-111-2222 1 1 いちご 180 赤い,甘い,ケーキ 5 2018-01-01 00:00:00

以上ですが
❶次のSQLを発行して商品1の情報を取り出します。
結果は
maker_id
1
 以上ですが

 ❷このデータ「maker_id」を見て、1であることを知ります。

「1であること」の意味が分かりません
 id=1 はなんのキーワードですかね?

「my_items」テーブルのカラム「maker_id」は1.2.1.3
です。
 それに対する 
maker_id  1 である意味とは何ですか?
ここでは 著者は 何を言いたいのでしょうか?
それとも わけわかめ でしょうか?
よろしくお願いいたします。itigoseisannsya.png

1

7Answer

テーブルmy_itemsにあるのは生産者ID(maker_id)のみなので、生産者の情報を知りたい場合はその生産者IDをもとにテーブル「makers」を参照する必要があります。

つまり、いちごの生産者の情報を得る流れは以下のようになります。

①テーブルmy_itemsをSELECT
②いちごの生産者のID(maker_id)が「1」だとわかる
③テーブルmakersから「id = 1」の条件でSELECT
④いちごの生産者が山田さんであることがわかる

疑問に感じられている部分はこの②に当たる部分です。
1つ注意点として、「my_itemsmaker_id」と「makersid」が紐づいているのであって、「my_itemsid」と「makersid」との間には特に関連性はないことに注意する必要があります。


また、最終的に筆者の言いたいことは、
1つずつテーブルを参照していくのではなく、
my_itemsmaker_id」と「makersid」でリレーション(関連)があるので、結合してまとめてSELECTしたほうが効率的、というような内容だと思います。

1Like

Comments

  1. @nrr06402

    Questioner

    素晴らしいご回答いただいているみたいです。
    手が空き次第見ます。
    お待ち下さい。

まず目的は「いちご生産者の情報を調べること」になります。

そこで、まず商品「いちご」の情報を調べます。
商品テーブル(my_items)で商品名(item_name)が「いちご」になっているレコードのidは 1 です。
そのidを使って商品情報を取得しているのが1⃣のSELECT * FROM my_items Where id=1;です。

id maker_id item_name price keyword sales created
1 1 いちご 180 赤い,甘い,ケーキ 5 2018-01-01 00:00:00

idはマイナンバーや学籍番号のように1つの情報を特定する(一意に決まる)ものですから、結果はこのように商品「いちご」のレコードが1件取得されます。

(問題の前後関係はわかりませんが、この例だとid = 1よりitem_name = 'いちご'の方が分かりやすいかもしれないですね)

このような流れで商品「いちご」(my_items.id = 1)の生産者ID(maker_id)は 1 であることがわかります。

そして続く3⃣で生産者IDが 1 の情報を取得する、という流れです。
(3⃣のSQLはFROM my_itemsではなくFROM makersだと思います)

1Like

データを抽出するクエリを書くのに、データの件数は特に関係です。

いちごの生産者の情報を得るクエリは、データの件数が4件でも、数万件だとしても、以下のようになるのは変わらないです。

SELECT * 
FROM makers, my_items
WHERE my_items.id=1
AND makers.id=my_items.maker_id

いちごの生産者ID=1とわかっていないのであれば、
@blue32さんの言う通り以下のようなクエリの方が適切かと思われます。

SELECT * 
FROM makers, my_items
WHERE item_name = 'いちご'
AND makers.id=my_items.maker_id

例えば、作物の名前を入力すると生産者一覧を見ることのできるシステムを作るといった場合、上のクエリの「いちご」の部分を入力値にすることで、その作物の生産者一覧を表示することができます。

テーブル「my_items」のデータの持ち方によってはこのクエリではデータが膨れる可能性もあるので、厳密にはもう少し複雑なクエリになると思います。

1Like

「maker_id」が「1」であるか無いかがわからなくても
最初から
SELECT * FROM makers Where id=1
と検索したほうが 手っ取り早い気がします。

おそらくですがmakersテーブルには生産している商品の情報は無いのだと思います。(ここでデータを示されていないので予想です)
なのでmy_itemsテーブルから 「いちごの生産者」につながる情報を検索する手順 は必要になります。
試しに「バナナの生産者」や「ブルーベリーの生産者」で考えてみましょう。my_itemsテーブルを見ずにいきなりmakersテーブルを検索できるでしょうか?

「手っ取り早い」の理由が「データが少ないから」ということであれば、頭の中でやったほうが速いのは確かにおっしゃるとおりです。
ただそうなると、「そもそもデーターベースやクエリを使う必要がない」となりますから、「 データベースを使って解決したいくらいにはデータがたくさんある状況 」が前提にあると考えられるでしょう。
そういう意味ではデータの件数や量の話です。

しかし「商品情報と生産者情報から いちごの生産者 を探す手順」については、データベースでも頭の中でも変わりませんから、この点は@YottyPGさんがおっしゃるようにデータの件数は関係ない話ですね。

1Like

Comments

  1. @nrr06402

    Questioner

    ありがとうございました。
    makers表のid=1の生産者は、何の生産者かこれだけでは分かりません。
    なので
     必要ですね^^

ありがとうございます。
どうすみません、現在検証中ですが
質問内容にミスがありました。

❸次SQLを発行して、生産の情報を検索します。
(P.180)
01 SELECT * FROM my_items Where id=1;
❹こうして山田さんであることを知る

 以上ですが テーブル名が違っていました。
正規のテーブル名は
 SELECT * FROM makers Where id=1;
でした。

0Like

ありがとうございます。

現在検証中です。

SELECT maker_id FROM my_items WHERE id=1
を 文章化すると
問合わせは内容はmy_itemsテーブルの項目(カラム)maker_idをりたいです。
それで、探すシリアルナンバー id=1 です。
 結果が
maker_id
1
 が算出されました。maker_idが1である
それで
 今度は SELECT * FROM makers Where id=1
結果は
1 山田さん 東京都港区 000-111-2222

 さて それで 疑問があります。
 「maker_id」が「1」であるか無いかがわからなくても
最初から
SELECT * FROM makers Where id=1
と検索したほうが 手っ取り早い気がします。
何か間違っていますでしょうか?
 よろしくお願いいたします。
 

0Like

これは
大規模 データベースを構築した場合の事例でだったの!?

書籍には そんな説明がないので 4件しかないデータ
なのに 検索 ですか・・・なので私がバカでした。

 やけどをする前に 私はバカだと認めた方が身の為です。
哲学はさておき

そもそも
「なんで 4件しかないでデータ」検索する意味が不明でした。

たぶん もし 万単位のデータ検索するとなると
ちゃんとして検索システムを構築しないといけなくなります。

そんな意味合いがある 事例の紹介だと思われます。
 すみません
間違いないでしょうか?
宜しくお願い致します。

0Like

Your answer might help someone💌