質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

2255閲覧

データベース副問い合わせについて、質問したいですが...

Kuriaki

総合スコア85

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/10/26 01:12

昨日も同じ質問させていただきましたが、質問がちょっと違いましたので、改めて質問させていただきます。

状況を説明します。

table1

idownerstaff
122
213
331
423
513

table2

iduser_idname
1abcd山田
2bcad中村
3cbda高橋

データベースに二つのテーブルがありまして、
table1のownerとstaffの値はtable2のidです。
そしてownerとstaffのデータを取り出すときに、数字ではなく、
talbe2のidを見て、nameの値を出したいです。

そして、今のtable2にはid三つしかないですが、例えばtalbe1のownerとstaffに4もしくは5が存在するときには、table2のidを見て、ないidは[データありません]と表示したいです。

以上です。
説明下手で申し訳ないです。
まったくdbの初心者ですので、わかりやすくお願いいたします。
何卒、宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

副問合せをするより、LEFT JOINを活用したほうがスッキリ書けると思います。

SQL

1SELECT 2 table1.id AS id, 3 COALESCE(owners.name, '[データありません]') AS owner_name, 4 COALESCE(staffs.name, '[データありません]') AS staff_name 5FROM table1 6 LEFT JOIN table2 AS owners ON owners.id = table1.owner 7 LEFT JOIN table2 AS staffs ON staffs.id = table1.staff

なお、「他のテーブルにない値を入れる必要がある」などの特段の事情がない限り、リレーションに使う列には外部キー制約を入れて、「参照先が見つからない」事態を避けるようにするべきだとは思います。

投稿2017/10/26 01:27

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaya_ohashi

2017/10/26 01:34

COALESCEの存在を忘れてましたテヘ
guest

0

命題についてはこう

元データ

SQL

1create table table1 (id int unique,owner int,staff int); 2insert into table1 values(1,2,2),(2,1,3),(3,3,1),(4,2,3),(5,1,3),(6,4,1),(7,2,5),(8,4,5); 3create table table2 (id int unique,user_id varchar(20),name varchar(20)); 4insert into table2 values(1,'abcd','山田'),(2,'bcad','中村'),(3,'cbda','高橋');

検索

SQL

1select t1.id,coalesce(t2.name,'no one') as owner_name,coalesce(t3.name,'no one') as staff_name 2from table1 as t1 3left join table2 as t2 on t1.owner=t2.id 4left join table2 as t3 on t1.staff=t3.id 5

ただし、問題点がいくつかあります。

  • table2にないidをtable1に登録できる事自体がおかしい

この手のものは外部キー結合で処理する前提でかならず対応するものを用意しておくべき

  • もし対応するものがない場合は、「データがありません」と表示するのではなく

そのキーに基づくデータ自体を表示させないようにすべき

  • table1でownerやstaffを数値(table2のid)をキーにリレーションしているが、

ユーザーのヒモ付をするならuser_idを利用すべき

投稿2017/10/26 01:42

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SQL

1SELECT 2 table1.id AS `id`, 3 COALESCE(v_owner.name, 'ありません') AS `owner`, 4 COALESCE(v_staff.name, 'ありません') AS `staff` 5FROM 6 table1 7 LEFT OUTER JOIN table2 ON (table2.id = table1.owner) `v_owner` 8 LEFT OUTER JOIN table2 ON (table2.id = table1.staff) `v_staff` 9;

LEFT OUTER JOIN は、結合条件の左辺側が「存在しないとき」に、代わりに「すべてのカラムが null」というダミー列が結合されます。
そして COALESCE は、引数の中で左から順に見て、「最初に見つけた null ではない値」を返します。
これを組み合わせることで、owner や staff が table2 でいない場合に(v_owner.name や v_staff.name が null になる)、「ありません」という結果になるようになっています。

既に他の方も書かれていますが、データの整合性を担保する意味からも、整合性制約(foreign key)を設定して、そもそも ありません という状態にならないようにするのが定法です。

投稿2017/10/26 01:32

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SQL

1SELECT 2 t1.id, 3 IF(t2o.name IS NULL, "データがありません", t2o.name) AS ownerName, 4 IF(t2s.name IS NULL, "データがありません", t2s.name) AS staffName 5FROM 6 table1 AS t1 7 LEFT JOIN table2 AS t2o ON t1.owner = t2o.id 8 LEFT JOIN table2 AS t2s ON t1.staff = t2s.id 9;

こんなかんじですかね。

  • ownerとtable2をひも付けてt2oとする(LEFT JOIN 1行目)
  • staffとtable2をひも付けてt2sとする(LEFT JOIN 2行目)
  • t2oからnameを取ってownerNameとする、ない場合はデータがありませんとする(IF 1行目)
  • t2sからnameを取ってstaffNameとする、ない場合はデータがありませんとする(IF 2行目)

補足

ASというのは「◯◯は◯◯という仮名を付ける」という使い方で、table1をいちいち書くのが面倒だからt1としたり、こういう条件でひも付けた方はこういう名前、こっちの条件でひも付けたほうはこういう名前、と区別を付けるために使うAlias(エイリアス、別名)をつけるものです。

投稿2017/10/26 01:24

編集2017/10/26 01:33
masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問