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

ユースケースステートメントを使用できます。

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

問題は、あなたが持っているかもしれないということです

{ "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 に答える
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 に答える