私は周りを見回していて、自分のニーズを満たす解決策を見つけることが難しいと思われるので、お手伝いができることを願っています。 (私はMySQLの方がやや新しくなっていますが、SQL ServerとOracleの豊富な経験がありますが)。複数のテーブルからデータを収集するためのMySQLループ
私はいくつかのテーブルを持つデータベースを持っています。
最初のテーブルは、基本的な情報を格納し、cp_def呼ばれる定義テーブルである:cp_defテーブルの各レコードに対して、
cid (pkey) status
-------------------
10001 0
10002 1
そして、対応cp_ある[CID]表(ここで、[CID ]はcp_defテーブルのcid値です)。例:
私はすべてのcp_ [CID]テーブル、出力のすべてのレコードのためのコードとdate_expired列の値に(シェルスクリプトとcronジョブの一部として)毎日、動的クエリを実行する必要がtable: cp_10001
id(pkey) code date_issued date_expired
-------------------------------------------------
1 ABC123 2011-06-23 2011-06-30
2 CYG124 2011-06-23 2011-06-30
table: cp_10002
id(pkey) code date_issued date_expired
-------------------------------------------------
1 CAC126 2011-06-23 2011-06-30
2 VGC254 2011-06-23 2011-06-30
date_issued値は前日の日付です。
質問があります(下記参照)。ただし、新しいcp_ [CID]テーブルを追加するたびに、別のUNION ALLステートメントを手動で追加してクエリを終了する必要があります。
SELECT code, date_expired
FROM mydatabase.cp_10001
WHERE DATE(date_issued) = DATE_SUB(CURDATE(), INTERVAL 1 DAY);
UNION ALL
SELECT code, date_expired
FROM mydatabase.cp_10002
WHERE DATE(date_issued) = DATE_SUB(CURDATE(), INTERVAL 1 DAY);
私の究極の目標は、毎回新しいcp_ [CID]テーブルがデータベースに追加されるように、それは手動の介入を必要としない、それが実行されます時に、programmaticly上記のクエリを生成することです。
私はビューを使ってみました。しかし、テーブルを追加すると、新しいテーブルを考慮して、ビューを手動で変更する必要があるように見えました。
各cp_ [CID]テーブルがcp_defテーブル(INFORMATION_SCHEMAテーブル)にリストされているとすれば、私は動的クエリを構築するために何らかのループを実行できると考えていましたが、理解した。これを短く保つために、cp_defテーブルをループして失敗した試みを投稿して動的クエリを作成しないようにします。
このようなクエリを作成するための正しい方向に私を指差してくれれば、助けてくれれば幸いです。もし私が何か見落としてしまったら、私は謝ります。私は、私が探しているものを、さまざまなフレーズで正確に検索しようとしましたが、無駄です。
これは、SQLステートメントの生成に完璧に機能する情報をありがとう。 準備されたステートメントの提案を使用しようとしましたが、準備されたステートメントを実行すると、SELECT GROUP_CONCATステートメントの結果が返されます。 'SELECT GROUP_CONCAT(CONCAT( 'SELECT code、date_expired FROM mydatabase.cp_ '、cid、' WHERE DATE(date_issued)= DATE_SUB(CURDATE()、INTERVAL 1 DAY) ')区切り文字'¥r¥nUNION ALL¥r¥n ')からFROM mydatabase.cp_def' – Andrew
あなたが提供できる支援準備された声明をデザインするのを手伝ってくれたら大いに感謝します。 SET @s:= "SELECT GROUP_CONCAT(CONCAT( 'SELECT code、date_expired FROM mydatabase.cp_'、cid、 'WHERE DATE(date_issued)= DATE_SUB(CURDATE()、INTERVAL 1 DAY)は、 ')SEPARATOR' \ r \ nUNION ALL \ r \ n ')FROM mydatabase.cp_def "; PREPARE stmt FROM @s; EXECUTE stmt; – Andrew
私は答えを更新しました。 – Devart