有没有办法用PHP中的表名分隔MySQL查询结果?

时间:2013-04-13 16:46:39

标签: php mysql sql

示例:

SELECT chapter.id, book.title, book.author FROM chapter 
INNER JOIN book ON (chapter.book = book.id)

获取该查询后,我想得到这样的结果:

Array
(
    [0] => Array
        (
            [chapter] => Array
                (
                    [id] => 1
                )

            [book] => Array
                (
                    [title] => Lorem Ipsum
                    [author] => John Doe
                )

         )

)

更好的是, stdClass 对象。

好吧,经过一段时间的搜索和工作,我找到了一种通过php-sql-parser解析SQL语句来实现我想要的方法,但这对我的问题来说真的不是一个好的解决方案。

我有具体的理由,解决方案对我的项目来说是一个很大的好处。虽然我真的不认为有一种更简单的方法可以做到这一点......

3 个答案:

答案 0 :(得分:1)

一种方法是命名(别名)结果集的列,以便PHP代码知道在哪里“归档”它们,例如:将表和列拆分为:

SELECT chapter.id as `chapter:id`, book.title as `book:title`, book.author as `book:author` ...

然后,当从PDO / mysqli检索结果时,您可以拆分生成的密钥以了解数据的存储位置:

$formatted_row = array();
foreach ( $db_row as $column_alias => $value )
{
     list($table, $column) = explode(':', $column_alias);
     $formatted_row[$table][$column] = $value;
}

答案 1 :(得分:1)

fetch_fields()功能将为您提供所需的信息。脚本

<?php
$sql = "
SELECT u.user, h.db, RAND() x FROM mysql.user u
LEFT JOIN mysql.host h ON h.host = u.host
";
$conn = new mysqli('localhost', 'root', '', 'mysql');
$stmt = $conn->query($sql);
$fields = $stmt->fetch_fields();
print_r($fields);

产生以下输出:

Array(
    [0] => stdClass Object(
            [name] => user
            [orgname] => User
            [table] => u
            [orgtable] => user
            [def] => 
            [db] => mysql
            ...
        )
    [1] => stdClass Object(
            [name] => db
            [orgname] => Db
            [table] => h
            [orgtable] => host
            [def] => 
            [db] => mysql
            ...
        )
    [2] => stdClass Object(
            [name] => x
            [orgname] => 
            [table] => 
            [orgtable] => 
            [def] => 
            [db] => 
            ...
        )
)

因此您可以使用dborgtable字段来确定每个字段来自哪个表格。

答案 2 :(得分:0)

$query         = $myPdoInstance->prepare('SELECT lorem FROM ipsum...');
$metaData      = array();
$data          = new stdClass;
$i             = 0;
$tablesIdField = 'id';

$query->execute();

while ($columnsMeta = $query->getColumnMeta($i++)) {
    $metaData[] = $columnsMeta;
}

foreach ($query->fetch(PDO::FETCH_NUM) as $key => $columnValue) {

    $currentTable = $meta[$key]['table'];

    if (!isset($data->{$currentTable})) {
        $data->{$currentTable} = new stdClass;
    } elseif (!is_object($data->{$currentTable})) {
        $prev                                    = $data->{$currentTable};
        $data->{$currentTable}                   = new stdClass;
        $data->{$currentTable}->{$tablesIdField} = $prev;
    }

    $data->{$currentTable}->{$meta[$key]['name']} = $columnValue;
}

这是我所做的非常简单的示例。这对我的项目来说是一个很好的解决方案 我在我的项目中使用的代码太复杂了,我实现了类在这里发布。

所以,如果这个例子中有任何语法错误,我很抱歉!

相关问题