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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

解決済

2つのテーブルを関連付けて呼び出すSQL文の書き方について

emi_ono
emi_ono

総合スコア77

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

1回答

0リアクション

2クリップ

285閲覧

投稿2022/09/19 04:38

前提

よろしくお願いします。
下記2つのテーブルを設定しています。

SQL

CREATE TABLE IF NOT EXISTS `holidaysub` ( `holiday_no` int(11) NOT NULL COMMENT '休日のID', `holiday` varchar(50) NOT NULL COMMENT '休日', `break_time` varchar(500) NOT NULL COMMENT '休み時間', `shop_id` int(11) NOT NULL COMMENT '店舗ID, `image_id` int(11) NOT NULL DEFAULT '0' COMMENT 'スタッフのID', `created` varchar(50) NOT NULL COMMENT '作成日時' )

SQL

CREATE TABLE IF NOT EXISTS `staff` ( `image_id` int(11) NOT NULL COMMENT 'スタッフのID', `file_name` varchar(255) NOT NULL COMMENT '画像の名前', `file_path` varchar(255) NOT NULL COMMENT '画像ファイルのパス', `staff_name` varchar(140) NOT NULL COMMENT 'スタッフ名', `shop_id` int(11) NOT NULL COMMENT '店舗ID', `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成日時' )

それぞれ「image_id(スタッフのID)」で関連づいています。

現在

PHP

$sql = "SELECT * FROM holidaysub WHERE shop_id = ".$shop_id." AND holiday >= '{$today}' ORDER BY holiday";

のSQL文をfetch(PDO::FETCH_ASSOC)を使って、すべての行を取り出し

PHP

echo $rec['holiday'];

で休日を表示しています。

実現したいこと

表示している休日と関連付いた「staff」テーブルの「staff_name(スタッフ名)」を同時に

PHP

echo $rec['holiday'].$rec['staff_name'];

このような?形で表示したいのですが、SQL文をどのように書けば良いのか分からず詰まっています。

該当のソースコード

PHP

<?php session_start(); if ( !isset( $_SESSION[ "shop_name" ] ) ) { $no_login_url = "login_form.php"; header( "Location: {$no_login_url}" ); exit; } //セッションの値を受け取る $shop_id = $_SESSION[ 'shop_id' ]; $shop_name = $_SESSION[ 'shop_name' ]; $shop_mail = $_SESSION[ 'shop_mail' ]; //日付取得 $today = date( 'Y-m-d' ); //本日の日付 require_once( '../../../core/config.php' ); try { // PDOインスタンスを生成 $dbh = new PDO( DSN, DB_USER, DB_PASS ); $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); } catch ( PDOException $e ) { // エラーメッセージを表示させる echo 'データベースにアクセスできません!' . $e->getMessage(); // 強制終了 exit; } $sql = "SELECT * FROM holidaysub WHERE shop_id = ".$shop_id." AND holiday >= '{$today}' ORDER BY holiday"; $prepare = $dbh->query( $sql ); $prepare->execute(); $count = $prepare->rowCount(); //データ数を取得 $dbh = null; ?> <!doctype html> <html lang="ja"> <body> <!-- ++++++++++++++++++++++++ main ++++++++++++++++++++++++ --> <main> <div id="content-wrap"> <!--コンテンツ開始--> <div id="contents"> <div class="tableWrap_s"> <h2>休日確認</h2> <?php if ( $count == 0 ) { ?> <p class="cmt">データはありません</p> <?php } else { ?> <div> <table> <tbody> <?php while ( true ) { $rec = $prepare->fetch( PDO::FETCH_ASSOC ); if ( $rec == false ) { break; }?> <tr> <?php if( $rec['holiday'] && empty($rec['break_time'])){?> <td><?php echo $rec['holiday']; ?></td> <td class='delete'><a href="./holidayDelete.php?no=<?php echo $rec['holiday_no']; ?>" class='submit_a'>削除</a></td> </tr> <?php }}?> </tbody> </table> </div> <?php }?> </div> </div> <!--コンテンツ終了--> </div> </main> <!-- ++++++++++++++++++++++++ main END ++++++++++++++++++++++++ --> </body> </html>

試したこと

「CROSS JOIN」や「LEFT JOIN」を使うのかな?と考え検索したりしたのですが、実現したい事と結びつけられませんでした。

補足情報(FW/ツールのバージョンなど)

phpMyAdmin SQL
PHP Version: 5.4.16

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

emi_ono

2022/09/19 13:15

質問では それぞれ「image_id(スタッフのID)」で関連づいています。と書いたのですが、 スタッフ指定がない場合holidaysubテーブルのスタッフID(image_id)に0が入るようにしたのですが、 staffテーブルのスタッフID(image_id)には0が存在しません。 スタッフID(image_id)が0以外の場合は紐づいたスタッフ名を表示し、0の場合は「スタッフ指定なし」と表示させるにはSQLはどう書けば良いでしょうか? よろしくお願いします。
sazi

2022/09/20 04:44

holidaysubはスタッフ毎のテーブルですか? 「スタッフ指定なし」と表示させたいのなら、holidaysubをスタッフとは関係ない状態でselectする必要がありそうですけど?
emi_ono

2022/09/21 06:48

ありがとうございます! holidaysubはスタッフ毎のページではないのですが、LEFT JOINを使ってうまくできました。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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