-2
$STH_1 = $DBH_R->query("SELECT table_name                        
                         FROM information_schema.tables                        
                        WHERE table_name                        
                         LIKE 'v_c_ei\_9%'
                         ");
$stmts_1 = array();

while (($row_1 = $STH_1 -> fetch_assoc()) !== null){

$table_name = $row_1['table_name'];
$stmts_1[] = sprintf("SELECT *  
                        FROM $table_name
                       WHERE (ei_code = '1117') AND (DAY(date_time) != '00') 

                     "); 

} 

$stmt_1 = implode("\nUNION\n", $stmts_1);  
$stmt_1 .= "\nORDER BY date_time ASC";  

$STH_5_2 = $DBH_R->query($stmt_1);

while (($row_5_2 = $STH_5_2 -> fetch_assoc()) !== null){

OK、上記のスクリプトは問題なく動作しています。しかし、その機能を変更したい (しなければならない)。UNION (ORDER BY ... LIMIT のようなもの) の前に選択を行う必要がありますが、これは機能していません。解決策は、sprintif を UNION & UNION & UNION に変更することです... しかし、問題は、テーブルの数がわからないことです。

最初のクエリのテーブル名は次のようになります

v_c_ei_9001
v_c_ei_9002
..........
v_c_ei_9030
..........
ect.

qよりも:テーブルの数がわからない場合に、sprintif(およびおそらく配列$ stmts_1も)を上からUNIONに変更するにはどうすればよいですか?ありがとう

4

2 に答える 2

0

私が見るように、それ自体を示す簡単な方法は、問題の解決策を検討する代わりに、何でも書くことです。状況は質問の評価に似ています-問題の複雑さが視聴者の関与を超えている場合、質問する人を実際に助けるよりも否定的に評価する方が簡単です。そして、何かを書く代わりに、ただ話すだけではありません。

そのような問題に直面するかもしれないすべての人のために、私は操作上の解決策を与えます。

最も単純な全体的な解決策は、メインクエリが実行されるテーブルを指定することでした。ORDER BYによってメインクエリで取得される予定だったものは、メインクエリのテーブルが実行される前にランク付けすることにより、最初のクエリで最初の補助要求が取得されました。

このようにして、ORDER BY句が最初の補助リクエストに転送されるため、メインクエリでの2xORDERBYの問題を回避できます。

$STH_1 = $DBH_R->query("SELECT c.table_name 
                          FROM v_c_country c 
                    INNER JOIN information_schema.tables i ON i.table_name = c.table_name 
                      ORDER BY c.country_name_pl ASC                                      ");

while (($row_1 = $STH_1 -> fetch_assoc()) != null){


$table_name = $row_1['table_name'];

$stmts_1[] = sprintf("SELECT *,'$table_name' AS table_name, time(date_time) AS time_dt, date(date_time) AS date_dt, MAX(date_time) AS MAXdate  
                        FROM $table_name
                       WHERE ei_code = '1117' AND (DAY(date_time) != '00') 
AND date_time = (SELECT MAX(date_time) FROM $table_name WHERE ei_code = '1117' AND index_released = '1')
                  "); 

}


$stmt_1 = implode("\nUNION\n", $stmts_1); 

$STH_5_2 = $DBH_R->query($stmt_1);

私はここで、尋ねられた質問に対する寛容なアプローチに出会うことがよくあります。誰かが私たちを待っている質問をした場合、問題を解決するために助けを求めてください。私は本当に、助けの手を差し伸べて、本当に役立つ答えを与えるすべての人々に本当に感謝します。これらの人々は本当に起こります。

于 2012-05-13T16:37:27.147 に答える
0

ORDER BY次のように、 の各構成要素にandLIMIT句を追加するとUNION、次のようになります。

while (($row_1 = $STH_1 -> fetch_assoc()) !== null){

$table_name = $row_1['table_name'];
$stmts_1[] = sprintf("SELECT *  
                      FROM $table_name
                      WHERE (ei_code = '1117') AND (DAY(date_time) != '00')
                      ORDER BY date_time DESC LIMIT 1 
                     "); 

} 

そして、次のことを行います。

$stmt_1 = implode("\nUNION\n", $stmts_1);  
$stmt_1 .= "\nORDER BY date_time ASC";                   // <---- remember this bit

結果の文字列は次の$stmt_1ようになります。

SELECT *
FROM v_c_ei_9001
WHERE (ei_code = '1117') AND (DAY(date_time) != '00')
ORDER BY date_time DESC LIMIT 1
UNION
...
UNION
SELECT *
FROM v_c_ei_9030
WHERE (ei_code = '1117') AND (DAY(date_time) != '00')
ORDER BY date_time DESC LIMIT 1
ORDER BY date_time ASC                                 -- it's appearing down here!

ご覧のとおり、 your の最後の構成要素にUNION2 つの ORDER BY句があり、これは構文エラーです。上記のコメント行を削除するかremember this bit、そうでなければ (統合されたクエリを並べ替える必要がある場合) UNION、並べ替えを実行する外部クエリへのサブクエリを作成する必要があります。

$stmt_1 = "SELECT * FROM ("
$stmt_1 = implode("\nUNION\n", $stmts_1);  
$stmt_1 .= ") ORDER BY date_time ASC";
于 2012-05-02T13:12:33.453 に答える