我有一个查询,如下所述:
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');
在您的应用程序中,获取两行,然后将其转换为单个数组:
$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';
将来当您需要三个属性时,它会变得更加复杂。基本上,对于您想要的每个附加属性,还有一个自联接。您可以在单个查询中执行多少个连接存在实际限制,因此此解决方案无法扩展。
GROUP BY 也有一个解决方案,但它也很难编写并且性能很差。
尝试这个:
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');
这会将两个值作为单独的行返回:
从 a_name in ('EAN', 'NAME') 的属性中选择 a_value 作为 itemname
您是否需要将所有结果作为单行返回?并且您是否需要完全独立的 where 子句(而不仅仅是不同的值)?