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

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

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

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

PHP

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

Q&A

解決済

5回答

7309閲覧

SQLでSELECTの結果が出ない(空)

hideki0227

総合スコア19

SQL

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

PHP

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

0グッド

0クリップ

投稿2016/09/22 05:53

編集2016/09/22 06:31

以下のクエリを実行すると、エラーではなく返り値が空になります。なぜでしょうか?
WHERE以降の条件にあてはまるレコードは複数存在しているのですが、何もあてはまりません。
掲示板のようなものなのですが、PHPのプログラム上では投稿がゼロに、phpMyAdminでこのクエリを直接入れると返り値が空です。
関係ない部分も多いかもしれませんが、クエリ全文を載せます。

SQL

1SELECT 2tw_timeline.number, 3tw_timeline.id, 4tw_timeline.comment, 5tw_timeline.date, 6tw_timeline.replyto, 7tw_timeline.replyfrom, 8tw_timeline.quote_from, 9tw_account_detail.name, 10tw_account_detail.filename, 11quote_replyfrom.id AS quote_id, 12quote_replyfrom.comment AS quote_comment, 13quote_replyfrom.date AS quote_date, 14quote_quote_from.id AS quote_id, 15quote_quote_from.comment AS quote_comment, 16quote_quote_from.date AS quote_date, 17quote_detail.name AS quote_name, 18quote_detail.filename AS quote_filename 19FROM tw_timeline JOIN tw_account_detail ON tw_timeline.id = tw_account_detail.id 20JOIN tw_timeline AS quote_replyfrom ON quote_replyfrom.number = tw_timeline.replyfrom 21JOIN tw_timeline AS quote_quote_from ON quote_quote_from.number = tw_timeline.quote_from 22JOIN tw_account_detail AS quote_detail ON quote_detail.id = tw_timeline.id 23WHERE tw_timeline.id = 1 OR tw_timeline.id = 9 OR tw_timeline.id = 10 OR 24tw_timeline.id = 4 OR tw_timeline.id = 2 OR tw_timeline.id = 3 25ORDER BY tw_timeline.date DESC

tw_timeline(掲示板の投稿内容一覧)というテーブルがありまして、tw_account_detailというのは投稿者の名前などを格納するテーブルです。
同じtw_timelineおよびtw_account_detailのテーブルを2回ずつJOINしているのは、=の右の数値を条件に別の数値を取り出したいためです。

tw_timelineには以下のカラムが、
number, id, comment, date, replyto, replyfrom, quote_from
tw_account_detailには以下のカラムがあります。
id, name, prof, place, filename, created_date, updated_date

例えば各テーブルの1レコード目は以下のようなデータがあります。

tw_timeline

number
id
comment
date
replyto
replyfrom
quote_from

1
3
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
2016-07-25 17:29:25
0
0
0

tw_account_detail

id
name
prof
place
filename
created_date
updated_date

1
ひろし
ひろしの自己紹介2
東京2
e371bda7e8f2c361cb62978106696603.jpg
2016-09-19 05:01:36
NULL

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/09/22 06:02

そもそもデータがないので答えではないのですが。 あなたの考えている結果を返すSQLでないから件数が0なのです
hideki0227

2016/09/22 06:13

追記しましたが、これでわかることはありますでしょうか?
退会済みユーザー

退会済みユーザー

2016/09/22 06:19

カラム構造ではなくデータですね。 [ INNER ] JOIN なので全部にデータがある想定だとおもいますが
guest

回答5

0

ベストアンサー

多分 LEFT JOIN の感覚で INNER JOIN を使ってるのだと思われる。

sql

1SELECT 2 tw_timeline.number, 3 tw_timeline.id, 4 tw_timeline.comment, 5 tw_timeline.date, 6 tw_timeline.replyto, 7 tw_timeline.replyfrom, 8 tw_timeline.quote_from, 9 tw_account_detail.name, 10 tw_account_detail.filename, 11 quote_replyfrom.id AS quote_id, 12 quote_replyfrom.comment AS quote_comment, 13 quote_replyfrom.date AS quote_date, 14 quote_quote_from.id AS quote_id, 15 quote_quote_from.comment AS quote_comment, 16 quote_quote_from.date AS quote_date, 17 quote_detail.name AS quote_name, 18 quote_detail.filename AS quote_filename 19FROM 20 tw_timeline 21 LEFT JOIN tw_account_detail 22 ON tw_timeline.id = tw_account_detail.id 23 LEFT JOIN tw_timeline AS quote_replyfrom 24 ON quote_replyfrom.number = tw_timeline.replyfrom 25 LEFT JOIN tw_timeline AS quote_quote_from 26 ON quote_quote_from.number = tw_timeline.quote_from 27 LEFT JOIN tw_account_detail AS quote_detail 28 ON quote_detail.id = tw_timeline.id 29WHERE 30 tw_timeline.id = 1 31 OR tw_timeline.id = 9 32 OR tw_timeline.id = 10 33 OR tw_timeline.id = 4 34 OR tw_timeline.id = 2 35 OR tw_timeline.id = 3 36ORDER BY 37 tw_timeline.date DESC

で発行したらどうでしょう?

投稿2016/09/22 06:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/09/22 06:53

※ 抽出するためだけの条件変更のため ON 句は変更してません。   不正なデータが複数でます。
hideki0227

2016/09/22 20:26

LEFTを追加したら望む通りの挙動になりました(一部ASの使い方などで間違いがあったのでそれらも変えました)。 ありがとうございます。解決しました。 私自身JOINとLEFT JOINの違いの理解が曖昧なので、ちゃんと調べてみます。 ↓最終的なクエリ(★=変更箇所) ---------------------------------------- SELECT tw_timeline.number, tw_timeline.id, tw_timeline.comment, tw_timeline.date, tw_timeline.replyto, tw_timeline.replyfrom, tw_timeline.quote_from, tw_account_detail.name, tw_account_detail.filename, quote_replyfrom.id AS quote_replyfrom_id, quote_replyfrom.comment AS quote_replyfrom_comment, quote_replyfrom.date AS quote_replyfrom_date, quote_quote_from.id AS quote_quote_from_id, quote_quote_from.comment AS quote_quote_from_comment, quote_quote_from.date AS quote_quote_from_date, quote_replyfrom_detail.name AS quote_replyfrom_detail_name, ★ quote_replyfrom_detail.filename AS quote_replyfrom_detail_filename, ★ quote_quote_from_detail.name AS quote_quote_from_detail_name, ★ quote_quote_from_detail.filename AS quote_quote_from_detail_filename ★ FROM tw_timeline LEFT JOIN tw_account_detail ON tw_timeline.id = tw_account_detail.id LEFT JOIN tw_timeline AS quote_replyfrom ON quote_replyfrom.number = tw_timeline.replyfrom ★ LEFT JOIN tw_timeline AS quote_quote_from ON quote_quote_from.number = tw_timeline.quote_from ★ LEFT JOIN tw_account_detail AS quote_quote_from_detail ON quote_quote_from_detail.id = quote_quote_from.id ★ LEFT JOIN tw_account_detail AS quote_replyfrom_detail ON quote_replyfrom_detail.id = quote_replyfrom.id ★ WHERE tw_timeline.id = 1 OR tw_timeline.id = 9 OR tw_timeline.id = 10 OR tw_timeline.id = 4 OR tw_timeline.id = 2 OR tw_timeline.id = 3 ORDER BY tw_timeline.date DESC ----------------------------------------
guest

0

件数が0の理由がJOINなのかwhereなのかを切り分たいので、where区抜きでidに(1,9,10,4,2,3)が有るかを調べて、その時点で0件であればJOINの条件にて発生している事になります。件数が出ればWHERE条件が足りないとなります。

またFROM tw_timeline JOIN tw_account_detail ON tw_timeline.id = tw_account_detail.idのラインとJOIN tw_account_detail AS quote_detail ON quote_detail.id = tw_timeline.idが同じなので不要では無いかと、有っても問題ありませんが。

訂正:IDが1:nの場合は問題ありますね。

投稿2016/09/22 07:04

編集2016/09/22 07:50
A.Ichi

総合スコア4070

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

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

hideki0227

2016/09/22 20:28

ありがとうございます。 後半の重複はおっしゃる通りだったので直しました。
guest

0

出ている情報だけでは確たることは言えませんね。
tw_timelineテーブルの「number,replyfrom,quote_from」は同じデータ型でしょうか?
やっている事はこの3つが同じでIDが1,2,3,4,9,10のレコードを抜き出しているのだと思いますが、そういったレコードは本当に存在しますか?
次のSQLでも抽出レコード数は同じになるはずです。(1以上が出力されますか?)

SQL

1SELECT count(*) 2FROM tw_timeline 3WHERE id in(1, 9, 10, 4, 2, 3) 4AND number = replyfrom 5AND number = quote_from

投稿2016/09/22 06:47

hirohiro

総合スコア2068

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

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

hideki0227

2016/09/22 20:31

そうやって原因の範囲を狭めていくんですね。勉強になりました。 ありがとうございました。
guest

0

SQLしかタグがありませんが、DBやそのバージョンによって書き方が違うこともありますから、明記した方が良いです。

そもそも、データが1件入っていないか、ON, WHEREを満たすデータがないのかもしれません。
条件を少しずつ削って実行されては?
DBによっては
SELECT COUNT(*) FROM TABLE_NAME1 ;
で指定したテーブルのレコード件数を取得できます。
また、
WHERE tw_timeline.id in(1, 9, 10, 4, 2, 3)
って書き方ができます。

投稿2016/09/22 06:20

Orlofsky

総合スコア16415

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

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

hideki0227

2016/09/22 20:32

なるほど。次回からはちゃんと書こうと思います。 WHERE tw_timeline.id in(1, 9, 10, 4, 2, 3) の書き方も勉強になりました。 ありがとうございました。
guest

0

tw_timelineに対して同様の条件でSELECTしてください。それがで

投稿2016/09/22 06:17

yona

総合スコア18155

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

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

hideki0227

2016/09/22 20:32

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問