- ベストアンサー
複数テーブルにわたるCOUNT
複数のテーブルで検索条件が当てはまった行を検索し、 その総行数を得たいのですが、 以下のSQL文ではあさっての数値が出てしまいます。 構文が間違っているのでしょうか。 (MySQLを使っています) SELECT Count(*) FROM テーブル1,テーブル2,テーブル3 WHERE (テーブル1.列1 Like 検索文字 or テーブル2.列2 Like 検索文字 or テーブル3.列2 Like 検索文字; どなたか教えてください。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
SELECT Count(*) FROM テーブル1,テーブル2,テーブル3 WHERE (テーブル1.列1 Like 検索文字 or テーブル2.列2 Like 検索文字 or テーブル3.列2 Like 検索文字; 上記のSQLは、テーブル間の結合条件がない為、 結果、クロスジョインしてしまいます 〓例〓 テーブル1の総レコード数が5レコード テーブル2の総レコード数が5レコード テーブル3の総レコード数が5レコード の条件で以下のSQLを実行した場合 5×5×5=125件が検索されます SELECT A.A1, B.A1, C.A1 FROM テーブル1 AS A, テーブル2 AS B, テーブル3 AS C 単純に条件に該当するレコード件数を求めたい 場合は副問い合わせを利用します 副問い合わせはOLACLE・SQLSaver・ACCESSの機能として実装されていますが、MySqlに機能が実装されているかどうかは、知らないので、確認してみて下さい ちなみに、副問い合わせの機能を利用して、レコード件数を調べたい場合は以下のようなSQLを作成します SELECT (A.A_COUNT + B.B_COUNT + C.C_COUNT) AS SUM_COUNT FROM (SELECT COUNT(*) AS A_COUNT FROM テーブル1 WHERE 列名 Like '%文字列%') AS A, (SELECT COUNT(*) AS B_COUNT FROM テーブル2 WHERE 列名 Like '%文字列%') AS B, (SELECT COUNT(*) AS C_COUNT FROM テーブル3 WHERE 列名 Like '%文字列%') AS C MySqlで副問い合わせが利用出来ない 場合は、仕方無いですが3回に分けて 結果を求めるしかないですね 目的によっては内部結合を利用して 出来るかも知れませんがMySqlで利用可能 かどうか知らないので、これも確認して下さい SQLを基礎から覚えたい場合は ACCESSのJet-Sqlから始める事をお勧めします ACCESSのクエリという機能でビジュアル的に SQLを表現してくれるので理解が早いと思いますよ。
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
SELECT @A_COUNT:=COUNT(*) FROM テーブル1 WHERE 列名 Like '%文字列%'); SELECT @B_COUNT:=COUNT(*) FROM テーブル2 WHERE 列名 Like '%文字列%'); SELECT @C_COUNT:=COUNT(*) FROM テーブル3 WHERE 列名 Like '%文字列%'); SELECT @A_COUNT + @B_COUNT + @C_COUNT);
お礼
ご回答ありがとうございます。 MySQLでも副問い合わせ・内部結合はできるようで、 副問い合わせをしたら無事解決しました。 本当にありがとうございました。感謝です! まだまだ初心者ですので、解らないことがあった時はよろしくお願いします。