合并多个到多个结果

时间:2012-08-20 19:02:32

标签: mysql sql database

我正在使用以下SELECT声明:

SELECT *
FROM prefix_site_tmplvars
LEFT JOIN prefix_site_tmplvar_contentvalues 
ON prefix_site_tmplvar_contentvalues.tmplvarid = prefix_site_tmplvars.id
LEFT JOIN prefix_site_content
ON prefix_site_tmplvar_contentvalues.contentid = prefix_site_content.id
WHERE prefix_site_tmplvar_contentvalues.value = "chocolate"

这就是我的回忆:

[id] => 2  
[name] => flavor  
[value] => chocolate

[id] => 2 
[name] => type 
[value] => cookie

这是我想得到的结果:

[id] => 2
[flavor] => chocolate
[type] => cookie

有没有办法合并我的结果,所以我没有一堆行引用相同的ID?如果现在,我应该如何处理?

我正在使用Modx,而这正在使用模板变量表:http://wiki.modxcms.com/index.php/Template_Variable_Database_Tables

3 个答案:

答案 0 :(得分:1)

您可以使用案例陈述:

SELECT 
    id,
    MAX( CASE WHEN name = 'flavor' THEN value ELSE NULL END ) AS flavor,
    MAX( CASE WHEN name = 'type' THEN value ELSE NULL END ) AS type
FROM prefix_site_tmplvars
    LEFT JOIN prefix_site_tmplvar_contentvalues 
    ON prefix_site_tmplvar_contentvalues.tmplvarid = prefix_site_tmplvars.id
    LEFT JOIN prefix_site_content
    ON prefix_site_tmplvar_contentvalues.contentid = prefix_site_content.id
WHERE prefix_site_tmplvar_contentvalues.value = "chocolate"
GROUP BY id

当然,只有在提前知道要选择哪些键时,此方法才有效;但似乎在这种情况下你知道(风味+类型)。

答案 1 :(得分:0)

问题是,你可能有

{ "id": 2, "flavor": "chocolate", "type": "cookie" }

和另一行

{ "id": 3, "flavor": "vanilla", "calories": "375" }

...我不认为有一种简单的方法可以解决MySQL中的问题;你需要决定要查找的键。

另一方面,您可以在PHP中折叠行:

while($tuple = ...fetch tuple from mysql cursor...)
{
    list ($id, $name, $value) = $tuple;
    if (!isset($objs[$id]))
    {
        // You might want to add also "'id' => $id" to the array definition
        $objs[$id]= array ($name => $value);
    }
    else
    {
        $obj = $objs[$id];
        $obj[$name] = $value;
        $objs[$id] = $obj;
    }
}

现在$ objs包含所需的数据;但是你仍需要将它恢复到Modx中。

答案 2 :(得分:0)

您可以通过以下方式执行此操作:

SELECT id,
       max(case when name = 'flavor' then value end) as flavor,
       max(case when name = 'type' then value end) as type
FROM prefix_site_tmplvars LEFT JOIN
     prefix_site_tmplvar_contentvalues
     ON prefix_site_tmplvar_contentvalues.tmplvarid = prefix_site_tmplvars.id LEFT JOIN
        prefix_site_content ON prefix_site_tmplvar_contentvalues.contentid = prefix_site_content.id
WHERE prefix_site_tmplvar_contentvalues.value = "chocolate" 
group by id