-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){

好的,上面的脚本工作正常。但是,我想(必须)改变它的功能。我必须在 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)从 abowe 更改为 UNION?谢谢

4

2 回答 2

0

当您向 的每个组成部分添加ORDER BY和子句时,如下所示:LIMITUNION

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!

如您所见,您的最后一个组成部分UNION两个 ORDER BY子句,这是一个语法错误。删除remember this bit上面注释的行,否则(如果您需要重新排序统一查询)您必须将UNIONa 子查询设置为执行重新排序的外部查询:

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

如我所见,展示自己的简单方法是写任何东西,而不是考虑问题的解决方案。这种情况类似于评估问题 - 如果问题的复杂性超出了观众的参与范围,那么对它们进行负面评估比实际帮助提出问题的人更容易。不只是说话,而不是写任何东西。

对于所有可能面临此类问题的人,我给出了操作解决方案。

最简单的整体解决方案是指定执行主查询的表。通过 ORDER BY 在主查询中获得的内容是通过对主查询上的表执行预排序获得第一个查询的第一个辅助请求。

这样我们就避免了主查询中的 2x ORDER BY 问题,因为 ORDER BY 子句转移到了第一个辅助请求。

$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 回答