以下のような質問があります。
select a_value as itemname, (
select a_value from attributes where a_name = 'EAN'
) AS EAN
from attributes
where a_name = 'NAME';
ここでは、異なるwhere句を使用して同じテーブルから2つの値が必要であり、それらを同じフロントエンドテーブルにも表示しています。ここでサブクエリを回避できますか?
以下のような質問があります。
select a_value as itemname, (
select a_value from attributes where a_name = 'EAN'
) AS EAN
from attributes
where a_name = 'NAME';
ここでは、異なるwhere句を使用して同じテーブルから2つの値が必要であり、それらを同じフロントエンドテーブルにも表示しています。ここでサブクエリを回避できますか?
SELECT a_name, a_value
FROM attributes
WHERE a_name IN ('EAN', 'NAME');
アプリで、2つの行をフェッチしてから、それを1つの配列にピボットします。
$item = array();
while ($row = fetch()) { -- pseudocode
$item[ $row["a_name"] ] = $row["a_value"];
}
print_r($item);
SQLで操作を実行することもできますが、次のようになります。
SELECT aname.a_value AS itemname, aean.a_value AS EAN
FROM attributes AS aname
JOIN attributes AS aean ON aname.entity = aean.entity
WHERE aname.a_name = 'NAME' AND aean.a_name = 'EAN';
また、将来、3つの属性が必要になると、さらに複雑になります。基本的に、必要な追加属性ごとにもう1つ自己結合します。1つのクエリで実行できる結合の数には実際的な制限があるため、このソリューションはスケールアップしません。
GROUP BYを使用した解決策もありますが、記述が難しく、パフォーマンスが低下します。
これは、2 つの値を別々の行として返します。
a_name が ('EAN', 'NAME') にある属性から、a_value を itemname として選択します。
すべての結果を単一の行として返す必要がありますか? 完全に独立したwhere句が必要ですか(異なる値だけではなく)?
これを試して:
SELECT a1.a_value AS itemname, a2.a_value AS EAN
FROM attributes a1
LEFT JOIN attributes a2 ON s2.a_name = 'EAN'
WHERE a_name = 'NAME';
また
SELECT a_value
FROM attributes
WHERE a_name IN ('NAME', 'EAN');
また
SELECT MAX(IF(a_name = 'NAME', a_value, NULL)) AS itemname,
MAX(IF(a_name = 'EAN', a_value, NULL)) AS EAN
FROM attributes
WHERE a_name IN ('NAME', 'EAN');