来自几个按ASC排序的MySQL表的数据

时间:2011-11-11 12:01:27

标签: php mysql

在dbase中,我有几个名为aaa_9xxx, aaa_9yyy, aaa_9zzz的表。我想查找具有指定DATE的所有数据,并使用TIME ASC显示它。

首先,我必须在dbase中找到一个表:

$STH_1a = $DBH->query("SELECT table_name 
                  FROM information_schema.tables
                 WHERE table_name
                  LIKE 'aaa\_9%'
               ");


foreach($STH_1a as $row)
{  
$table_name_s1[] = $row['table_name'];  
}

其次,我必须找到具体日期的数据并用TIME ASC显示:

foreach($table_name_s1 as $table_name_1)
{
$STH_1a2 = $DBH->query("SELECT * 
                      FROM `$table_name_1`
                     WHERE
                           date = '2011-11-11' 
                  ORDER BY time ASC
                     ");

while ($row = $STH_1a2->fetch(PDO::FETCH_ASSOC)) {

echo " ".$table_name_1."-".$row['time']."-".$row['ei_name']." <br>";
}
}

..但它显示按表名排序的数据,然后按TIME ASC排序。我必须按TIME ASC排序所有这些数据(来自所有表)。


感谢dev-null-dweller,Andrew Stubbs和Jaison Erick的帮助。 我测试了Erick解决方案:

foreach($STH_1a as $row) { 

$stmts[] = sprintf('SELECT * 
                  FROM %s 
                 WHERE date="%s"', $row['table_name'], '2011-11-11'); 

                     }  

$stmt = implode("\nUNION\n", $stmts);  
$stmt .= "\nORDER BY time ASC";  

$STH_1a2 = $DBH->query($stmt);

while ($row_1a2 = $STH_1a2->fetch(PDO::FETCH_ASSOC)) {

echo " ".$row['table_name']."-".$row_1a2['time']."-".$row_1a2['ei_name']." <br>";
}

它正在运行,但我对'table_name'有疑问 - 它始终是LAST表名。

// --------------------------------------------- -------------------------

...以及包含所有修复的最终解决方案,感谢所有人的帮助,:))

foreach($STH_1a as $row) { 

$stmts[] = sprintf("SELECT *, '%s' AS table_name 
                  FROM %s 
                 WHERE date='%s'", $row['table_name'], $row['table_name'], '2011-11-   11'); 

}


$stmt = implode("\nUNION\n", $stmts);  
$stmt .= "\nORDER BY time ASC";  

$STH_1a2 = $DBH->query($stmt);

while ($row_1a2 = $STH_1a2->fetch(PDO::FETCH_ASSOC)) {

echo " ".$row_1a2['table_name']."-".$row_1a2['time']."-".$row_1a2['ei_name']." <br>";
}

3 个答案:

答案 0 :(得分:1)

不是在从db中获取行时打印行,而是将所有数据收集到一个数组中,以便能够使用usort和您自己的回调函数进行排序。

其他选项是直接从mysql进行排序,使用UNION选择如下:

$SQL = "
    (SELECT '$table_name_1' AS tbl_name, time, ei_name FROM `$table_name_1` WHERE date = '2011-11-11')
    UNION
    (SELECT '$table_name_2' AS tbl_name, time, ei_name FROM `$table_name_2` WHERE date = '2011-11-11')
    UNION
    (SELECT '$table_name_3' AS tbl_name, time, ei_name FROM `$table_name_3` WHERE date = '2011-11-11')
    ORDER BY time ASC
";

答案 1 :(得分:0)

您需要使用UNION sql指令:

<?php

$STH_1a = $DBH->query("SELECT table_name
                       FROM information_schema.tables
                       WHERE table_name
                       LIKE 'aaa\_9%'");

$stmts = array();
foreach($STH_1a as $row)
{
    $stmts[] = sprintf('SELECT *, %s AS `table_name` FROM %s WHERE date="%s"', $row['table_name'], $row['table_name'], '2011-01-01');
}

$stmt = implode("\nUNION\n", $stmts);

$stmt .= "\nORDER BY time ASC";

$STH_1a2 = $DBH->query($stmt);

FIX:将表名包含为返回值。

答案 2 :(得分:0)

正确的解决方法是UNION你的选择数据,如其他答案中所述。

快速解决方法是将您的第二个代码块更改为:

$Sorted = array();

foreach($table_name_s1 as $table_name_1)
{
    $STH_1a2 = $DBH->query("SELECT *
        FROM `$table_name_1`
        WHERE date = '2011-11-11'
        ORDER BY time ASC
    ");

    while ($row = $STH_1a2->fetch(PDO::FETCH_ASSOC)) {
        $Sorted[$row['time']] = " ".$table_name_1."-".$row['time']."-".$row['ei_name']." <br>";
    }
}

ksort($Sorted);

foreach($Sorted as $Entry) {
    echo $Entry;
}

注意:对于一个日期有多个条目的情况,这将“失败”。