[英]Trying to group up results of a SQL multi table query
对我来说,最好的解释方法是举一个例子
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中选择具有与ID相同的name_id
(在表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')
希望这是有道理的。
从数据库中获取结果数组后,我将其拆分...
//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
。
希望这对您有所帮助。
我不相信有一种方法可以在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'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.