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

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

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

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

Q&A

解決済

2回答

477閲覧

WPのSELECTでWHERE、JOINが実行できない。

FATE-T

総合スコア10

MySQL

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

0グッド

0クリップ

投稿2020/01/16 08:08

編集2020/01/17 02:10

前提・実現したいこと

以下の二つのテーブルを、結合して、条件に一致する項目のみを選び出し、昇順にソートするSELECT文を書きたいです。
以下のソースで実行しているのですが、欲しい結果が出ません、問題点や間違いが有ったらご教授ください。

データベース⓵ test_master

user_login  | posts_title
aaaa | AAAAAA
bbbb | AAAAAA
aaaa | BBBBBB

データベース⓶ users

id user_login  | display_name  |yomigana
1 aaaa | あああ      | アアア
2 bbbb | いいい      |イイイ
3 cccc | ううう      |ウウウ

データベース 欲しい結果

user_login  | display_name
aaaa | あああ
bbbb | いいい

該当のソースコード

mySQL

1 2$test = 'aaaa'; 3global $wpdb; 4$results = $wpdb->get_results(" 5 SELECT user_login , posts_title 6 FROM $wpdb->test_master 7 WHERE posts_title = {$test} 8 JOIN $wpdb->users 9 USING(user_login) 10 ORDER BY display_name ASC 11");

現在(上手くいったとき)

mySQL

1 2$test = 'aaaa'; 3global $wpdb; 4$results = $wpdb->get_results(" 5 SELECT user_login , posts_title 6 FROM $wpdb->test_master 7 WHERE posts_title = 'aaaa' ←を変数$testにしたいです。 8 JOIN $wpdb->users 9 USING(user_login) 10 ORDER BY display_name ASC 11");

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

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

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

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

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

m.ts10806

2020/01/16 08:14

提示されたデータにはposts_title = 'kscc226600' に該当する情報はないように見受けられます。 どのような結果になるのでしょうか。 また、変数はダブルクォートやヒアドキュメントのなかでは{}で囲われたほうが良いと思います。 配列やオブジェクトのアローなどは「そういう文字列」とみなされることもあります。
FATE-T

2020/01/16 08:25

ご連絡ありがとうございます。 データ間違いがありました。ご指摘ありがとうございます。 上記のように{}つけてみましたが、結果が変わりません。 ご指摘の意図と違いますでしょうか?
m.ts10806

2020/01/16 08:49

「配列やオブジェクトのアローなど」も、なので $wpdb-> でプロパティ参照しようとしているところもですね。 あと、今のコードではどう出力されるのでしょう?
FATE-T

2020/01/17 01:18

現状何も出ない表示されないです
m.ts10806

2020/01/17 01:23

MySQL側にエラーは出てませんか? あと、テーブル単体では出ますよね?
FATE-T

2020/01/17 01:39

[SELECT user_login , posts_title FROM test_master WHERE posts_title = 'aaaa' LEFT JOIN users test_master.user_login = test_master.user_login ORDER BY users.display_name ASC] で試したら、 【#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN wp_users wp_test_master.user_login = wp_test_master.user_login ORDER B' at line 1】 と出ました。 又、JOIN以降を外したら問題なく動きました。
m.ts10806

2020/01/17 01:44 編集

そこはすでに回答で指摘のある、構文の問題ですね。 サブクエリでもないのでWhereは現在の位置には置けません。
FATE-T

2020/01/17 02:00

WHEREを固定値ですると問題なく動くのですが、変数にすると動かなくなります。(表示されない) {}はつけています。
guest

回答2

0

ベストアンサー

プリペアドステートメントなどでなければ自動でSQLの文字を囲うクォーテーションはつけてくれません。

{$test} ↓ '{$test}'

ただ、たいていはユーザーからの自由な入力値をうけいれるので、
エスケープかましてから入れるか、エスケープの機能説明の注釈にあるようにprepare使うように実装を変更しましょう。

投稿2020/01/17 02:16

m.ts10806

総合スコア80850

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

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

FATE-T

2020/01/17 02:20

ありがとうございます。 上手く行きました。
m.ts10806

2020/01/17 02:21

3つ手法を提示しましたが、どれにされたのでしょうか。
FATE-T

2020/01/17 02:26

最終的に以下のようにしました。 $results = $wpdb->get_results(" SELECT user_login FROM $wpdb->test_master LEFT JOIN $wpdb->users USING(user_login) WHERE posts_title = '{$test']}' ORDER BY display_name ASC
FATE-T

2020/01/17 02:27

$results = $wpdb->get_results(" SELECT user_login FROM $wpdb->test_master LEFT JOIN $wpdb->users USING(user_login) WHERE posts_title = '{$test'}' ORDER BY display_name ASC
m.ts10806

2020/01/17 02:34

エスケープはしておかないとSQLインジェクションの脆弱性が残るので単にクォーテーション入れるだけでは不十分だったりします。 「SQLインジェクションとは?」を確認してからご検討を。
guest

0

もしかして:

SELECT user_login , posts_title FROM $wpdb->test_master JOIN $wpdb->users USING(user_login) WHERE posts_title = 'aaaa' ORDER BY $wpdb->users.display_name ASC

USING句はテーブルの結合に係るものなので、JOIN句の直後にないといけない。

投稿2020/01/16 08:21

編集2020/01/16 08:22
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

FATE-T

2020/01/17 01:20

ご回答ありがとうございます。 誤植でした。 質問文更新しました。 ご確認お願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問