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