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

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

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

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

Q&A

解決済

3回答

2457閲覧

mysqlのleftjoinでエラーになる原因がわからない

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

0グッド

0クリップ

投稿2018/04/10 13:40

編集2018/04/10 13:54

mysqlで結合するとエラーになります。各クエリーは個別では正常動作するのですが、left joinするとエラーになります。
いくら試しても原因がわからないので、エラーになる原因として考えられることがあれば教えてください。

[エラーになる内容]

SELECT t1.id
FROM(
SELECT id
FROM user_data
) t1
left join(
SELECT id
FROM login_tb
) t2
on t1.id = t2.id


[login_tb]
no id pass
1 tanaka ******
2 yamada ******

[user_data]
no id usrname
1 tanaka 田中
2 yamada 山田

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

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

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

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

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

alg

2018/04/10 13:48 編集

発生したエラーのメッセージと、`user_data` と `login_tb` のテーブルレイアウト、以上が提示されないと回答が付きにくいかもしれません。
退会済みユーザー

退会済みユーザー

2018/04/10 13:55

ありがとうございます、追記してみました。
alg

2018/04/10 15:07

解決されたようで何よりですが、エラーのメッセージは追記されなかったようですね。エラーメッセージは問題解決のための重要な情報なので、次回の質問では最初から明記しておくことをおすすめします。
alg

2018/04/10 15:10

また、「テーブルレイアウト」というのはテーブルの中に入っているデータの一覧ではなく、何という列がどのような型で定義されているか、という意味でした。SQLのエラーに関する質問では、これも最初から明記しておくことをおすすめします。
退会済みユーザー

退会済みユーザー

2018/04/10 15:14

ありがとうございます!アドバイスを頂いたおかげで本当に助かりました。アドバイス頂いたご内容、次回からしっかり反映させていただきます。誠にありがとうざいます。
guest

回答3

0

PDOをご利用のようで、しかもパラメータ渡しはないようなので
微妙ですが、念の為空の配列をexecuteに渡してみてはどうでしょう?

PHP

1try{ 2 $pdo = new PDO($dsn, $user,$password); 3 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 4 $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 5 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 6 7 $query ="SELECT t1.`id` "; 8 $query.="FROM `user_data` as t1 "; 9 $query.="left join `login_tb` as t2 on t2.`id` = t1.`id` "; 10 $stmt = $pdo->prepare($query); 11 $stmt->execute([]); 12 $rows=$stmt->fetchAll(); 13 print_r($rows); 14}catch(PDOException $e){ 15 die($e->getMessage()); 16} 17

投稿2018/04/10 14:29

yambejp

総合スコア114883

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

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

退会済みユーザー

退会済みユーザー

2018/04/10 14:38

ご丁寧にありがとうございます! myadminで実行したら下記のエラーがでました #1267 - Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '=' 検索したら「異なる照合順序の結合でエラーが発生する場合がある」とでてきました。 collate utf8_general_ci; とクエリー末尾に付けたらエラーがでなくなりました。 PDOの使い方も良くわかってない状態で、教えていただいて助かります。 試させていただきます。 ベストアンサーにさせていただきたかったのですが、先にご回答頂いた方にベストアンサーを付けさせていただいた後で、せっかく教えていただいたのに誠に恐縮です。 今後共何卒よろしくお願いいたします。 本当にありがとうございました。
guest

0

ベストアンサー

エラーメッセージになんてあるんですか?
これだけの情報だとデータ型が違う、位ですかね…

そもそもfrom句をサブクエリにする必要性が感じられないです。

sql

1SELECT t1.id 2FROM user_data t1 3 left join login_tb t2 on t2.id = t1.id

こんな感じでいいのでは?login_tbになにかwhere句を入れたいのでしょうか?

投稿2018/04/10 13:50

sousuke

総合スコア3828

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

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

退会済みユーザー

退会済みユーザー

2018/04/10 14:03

すみません、元はかなりゴチャゴチャしたクエリなのですがエラーなる個所を絞ったら、left joinした部分だけが残りました。 エラー原因ここから先の部分で特定できず質問させていただいた次第でございます。 他の場所ではエラーが出ないので、 login_tb 側のテーブルと結合したい側のテーブルのデータ型をチェックしたのですが、問題が見つかりませんでした。 SELECT t1.id FROM user_data t1 left join login_tb t2 on t2.id = t1.id ↑ ありがとうございます。 試させて頂いたのですが同じくエラーになってしまいます。 (エラー) Fatal error: Call to a member function execute() on boolean in 他のテーブルの結合は上手くいくので、もう一度テーブルをチェックしてみます。 ありがとうございます。
sousuke

2018/04/10 14:12

そのエラーはPHPでオブジェクトを作成する前にメソッドをなんたらってgoogleで出てきますが、sqlが悪いのではないのでは?
yambejp

2018/04/10 14:16

これはSQL文を直接mysqlクライアントやphpmyadminなどの入力画面で 処理していますか? なんらかのプログラムで処理していますか? 「execute()」と書かれているのをみると怪しいのですが? またプログラム経由で渡している場合、パラメータをなにか prepare処理などで渡していませんか?
退会済みユーザー

退会済みユーザー

2018/04/10 14:23

コメントありがとうございます。sqlをphpで実行しております。 $query ="ここに質問させていただいているクエリ"; $stmt = $pdo->prepare($query); $stmt->execute(); で実行しています。 なぜか、user_data のテーブルだけloft joinで弾かれてしまいます。 他のテーブルは結合できるので、mysqlのテーブルに問題があるかと思いデータ型をチェックし中身を照合しました。初心者で見よう見まねでやってるのですが、adminでもテストしてみますね! ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/04/10 14:31

phpmyadminでテストしたら下記のエラーメッセージがでました MySQL のメッセージ: ドキュメント #1267 - Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '=' 検索したら「異なる照合順序の結合でエラーが発生する場合がある」とでてきました。 初めてのケースです。 原因が特定できました! 解決方法は collate utf8_general_ci; をクエリーの末尾に入れたらエラーがでなくなりました! 本当に助かりました。ありがとうございました!
guest

0

追記です。

utf8_unicode_ci
utf8_general_ci

が別テーブルで混同していたのが一番の原因でした。

left join する時に「異なる照合順序の結合でエラーが発生」する場合があり、今回はそれが原因でエラーがでました。

phpでPDOで処理していたのですが、phpmyadminで同じクエリを実行したら下記のエラーがでて特定できました。

#1267 - Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='

クエリで応急処置する場合はcollate utf8_general_ci;を付け加えると、エラーが出ずに結合できます。

根本から改善するには、照合順序を統一すると良いようです。

初心者で見よう見まねで作っているのですが、みなさんにご回答いただいて原因を特定することができました。誠にありがとうございました。

投稿2018/04/10 14:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sousuke

2018/04/10 14:55

テーブルや列ごとに照合順序を設定することはほとんど出会わないケースなのであれですが、DBの引っ越しとか設定変更をされたんですかね?ともかく解決できてよかったですb 基本クエリを作る時は管理ツールで実行確認をしてからプログラム上に乗せることをおすすめします。私はそうしています。
退会済みユーザー

退会済みユーザー

2018/04/10 14:59

本当にありがとうございます! 自力では一週間くらいハマってた泥沼でございました。 記憶にないのですが何気なく照合順序を設定してしまっていたようです。 クエリは管理ツールで実行確認してからプログラムで動かすようにいたします。 大変勉強になります。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問