0

我正在使用以下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

4

3 回答 3

1

您可以只使用 case 语句:

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

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

于 2012-08-20T19:14:49.693 回答
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
于 2012-08-20T19:20:16.800 回答
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。

于 2012-08-20T19:14:33.260 回答