0

好吧,我解释的最好方法是举个例子

Table 1
ID | name        | class
-------------------------
 1 | first name  | a
 2 | second name | b

 Table 2
 ID | name_id | meta_key    | meta_value              |
-------------------------------------------------------
 1  | 1       | image       | someImage.jpg           |
 2  | 1       | description | very long description   |
 3  | 2       | image       | someImage_2.jpg         |
 4  | 2       | description | very long description 2 |

我正在尝试从表 1 中选择名称和类,以及表 2 中与name_idID 相同的所有记录(在表 1 中)。

这是我现在的查询:

SELECT
    table1.name,
    table1.class,
    table2.name_id,
    table2.meta_key,
    table2.meta_value                    
FROM 
    table1 
LEFT JOIN 
   table2 ON ( table1.ID = table2.name_id )           
WHERE 
   table1.ID = '2'

这有效并返回一个数组,其元素与具有 name_id = 2 的表 2 条目一样多

有没有办法返回一个数组,其中 1 的结果来自第一个表,另一个数组的结果来自第二个表?

更新:理想的结果将是: $result['table1'][0] = array('name' => 'second name', 'class' => 'b')

$result['table2'][0] = array('name_id' => 2, 
                             'meta_key' => 'image', 
                             'meta_value' => 'someImage_2.jpg')
$result['table2'][1] = array('name_id' => 2, 
                             'meta_key' => 'description', 
                             'meta_value' => 'very long description 2')

希望这是有道理的。

4

2 回答 2

0

从数据库中获取结果数组后,我将其拆分...

//Assuming your result-set is assigned to $result:

$table1_keys = array('id', 'name', 'class');
$table2_keys = array('id', 'name_id', 'meta_key', 'meta_value');

$table1_results = array();
$table2_results = array();

foreach($result as $key => $val) {
    if(in_array($key, $table1_keys)) {
        $table1_results[] = $val;
    }

    if(in_array($key, $table2_keys)) {
        $table2_results[] = $val;
    }
}

在此之后,您的结果集应该被分成两个数组:$table1_results$table2_results.

希望这对您有所帮助。

于 2013-10-29T22:45:22.623 回答
0

我不相信有办法在 SQL 中做到这一点,但我会标记每个表,以便它可以在 PHP 中完成。

SELECT
  ':table1',
    table1.name,
    table1.class,
  ':table2',
    table2.name_id,
    table2.meta_key,
    table2.meta_value
FROM ...

虽然我个人只是这样做。

SELECT 'table1', table1.*, ':table2', table2.*
FROM ...

这使得在客户端和服务器之间复制整行变得更容易,并在您决定添加新字段时减少维护。

但是,在您的查询中,您正在为返回的每一行复制 table1,所以这可能会更好。

SELECT
  table1.*,
  table2a.meta_value AS image,
  table2b.meta_value AS description
FROM
  table1
LEFT JOIN
  table2 AS table2a ON ( table1.ID = table2a.name_id AND table2a.meta_key = 'image' )
LEFT JOIN
  table2 AS table2b ON ( table1.ID = table2b.name_id AND table2b.meta_key = 'description' )
WHERE 
  table1.ID = '2'
于 2013-12-14T20:53:05.470 回答