避免在这个mysql语句中使用子查询

时间:2013-01-16 12:59:23

标签: mysql subquery entity-attribute-value

我有一个如下所述的查询:

select a_value as itemname, (
    select a_value from attributes where a_name = 'EAN'
) AS EAN 
from attributes 
where a_name = 'NAME';

这里我想要使用不同的where子句从同一个表中获取2个值,并且我也在同一个前端表中显示它们。我可以在这里避免使用子查询吗?

3 个答案:

答案 0 :(得分:0)

试试这个:

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');

答案 1 :(得分:0)

这会将两个值作为单独的行返回:

  

从('EAN','NAME')中的a_name属性中选择a_value作为项目名称

您是否需要将所有结果作为单行返回? 你需要完全独立的where子句(而不仅仅是不同的值)吗?

答案 2 :(得分:0)

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的解决方案,但它也很难编写并且表现不佳。