🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

PHP

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

Q&A

解決済

3回答

1024閲覧

phpのsqlについて

wada3

総合スコア103

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/09/18 02:06

編集2019/09/18 02:16

$no= 1
$sql = "select count(1) as cnt from A where no= :aaa ";
$sql1 = $sql;
$sql2 = str_replace('A' , 'B' , $sql);

$sql = $sql1 . " union " . $sql2 ;
$cnt = (int)this->dbAdapter->query(aql)->exequte(array(:no=> $no))->current()['cnt'];

このphpのソースでこのsql実行すると$cnt = 0 なのですが、なぜ$cnt = 1にならないのでしょうか

テーブルA
no name
2 a

テーブルB
no name
1 a

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

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

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

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

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

yambejp

2019/09/18 02:12

typoだらけで原因がなんとも言えません まずは動くところまでなおしてください
wada3

2019/09/18 02:17

すいません。しゅうせいしました
yambejp

2019/09/18 02:18

修正したやつでも動かないでしょ? 動くところまで修正してください
m.ts10806

2019/09/18 06:18

コードはマークダウンのcode機能を利用してご提示ください
m.ts10806

2019/09/18 06:20

あと、これだけでは想像による補完必須な部分が多すぎて的確な回答にはなりません。 DBのテーブル定義やサンプルデータ含めて他者が再現可能な情報をご提示ください
guest

回答3

0

ベストアンサー

質問する際は、このPHPの部分は、

PHP

1$no= 1 2$sql = "select count(1) as cnt from A where no= :aaa "; 3$sql1 = $sql; 4$sql2 = str_replace('A' , 'B' , $sql); 5 6$sql = $sql1 . " union " . $sql2 ;

以下の内容の方が、分かりやすいですよ。
(期待する結果ではないと思いますが)

PHP

1$no= 1 2$sql = "select count('X') as cnt from A where no= :aaa 3UNION 4select count('X') as cnt from B where no= :aaa";

上記を踏まえて、以下、指摘。

○指摘1

query(aql)

⇒query($sql) の間違い?

○指摘2

where no= :aaa
array(:no=> $no)

⇒SQL文が「:aaa」で、arrayには「:no」で上手く動くんですかね?

○指摘3
AテーブルとBテーブルのそれぞれの条件の両方のカウントを合計したいのであれば、
以下のようなSQLになるかと。

SQL

1SELECT ( 2 ( 3 SELECT COUNT('X') 4 FROM A 5 WHERE A.no = 1 6 ) 7 + 8 ( 9 SELECT COUNT('X') 10 FROM B 11 WHERE B.no = 1 12 ) 13 ) as cnt 14FROM dual

投稿2019/10/03 00:00

tomari_perform

総合スコア760

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

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

0

参考

SQL

1create table A(no int,name varchar(10)); 2insert into A values(2,'a'); 3create table B(no int,name varchar(10)); 4insert into B values(1,'a');

に対して

SQL

1select count(1) as cnt from A where no= 1 union select count(1) as cnt from B where no= 1

だと、cnt:0,1

SQL

1select count(1) as cnt from A where no= 2 union select count(1) as cnt from B where no= 2

だと、cnt:1,0

が、それぞれ返ります

投稿2019/09/18 02:16

yambejp

総合スコア116694

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

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

wada3

2019/09/18 02:20

$cnt=0ではないでしょうか?
yambejp

2019/09/18 02:26

実際にやってみればわかります やってから考えてください
wada3

2019/09/18 02:29

試しているのですが、currentしているので0,1で0が取得しているのでしょうか
yambejp

2019/09/18 02:32

dbAdapterがなにかよくわかりませんが、その仕様がそうなんでしょ? そもそも動かないソースを提示しているので検証はしていません
yambejp

2019/09/18 02:38

末尾の「;」がぬけてたり prepareの指定もおかしいし、intにキャストする意味もわからない いきなりthisが出てきたりも不親切
guest

0

$sqlの中身を確認してみましょう。

SQL

1select count(1) as cnt from A where no= :aaa unionselect count(1) as cnt from B where no= :aaa

のようになっているかと思います。unionselectがつながってしまい、SQL文が成立していません。

投稿2019/09/18 02:12

maisumakun

総合スコア145975

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

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

wada3

2019/09/18 02:15

記述ミスです。すいません. sql成立した状態ではどうでしょうか
sazi

2019/09/18 02:19

そもそも2つのテーブルそれぞれの件数を求めたいなら、union ではなくunion allでないと駄目だとか、どちらのテーブルか分からないというのもありますね。
wada3

2019/09/18 02:26

unionせずにBテーブルの検索だとcnt=1が取れましたが、union all にしても取得できませんでしたがなぜでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問