在MySQL子查询中select多个列/字段

基本上有属性表和翻译表 – 许多翻译为一个属性。

即使没有该语言的翻译logging,我也需要从翻译中为指定语言的每个属性selectid和value。 或者我错过了一些连接技术或连接(不涉及语言表)在这里不工作,因为下面不以特定语言返回具有非现有翻译的属性。

select a.attribute, at.id, at.translation from attribute a left join attributeTranslation at on a.id=at.attribute where al.language=1; 

所以我正在使用这样的子查询,这里的问题是使用相同的参数对同一个表进行两个子查询(感觉像性能消耗,除非MySQL组,这是我怀疑,因为它使你做许多相似的子查询)

 select attribute, (select id from attributeTranslation where attribute=a.id and language=1), (select translation from attributeTranslation where attribute=a.id and language=1), from attribute a; 

我希望能够从一个查询获得id和翻译,所以我concat列和后来从string获取id,至less使单个子查询,但仍然不正确。

 select attribute, (select concat(id,';',title) from offerAttribute_language where offerAttribute=a.id and _language=1 ) from offerAttribute a 

所以问题部分。 有没有办法从单个子查询中获取多个列,或者我应该使用两个子查询(mysql足够聪明,可以将它们分组?),或者正在join以下方法:

[[属性到语言]来翻译](连接3个表似乎比子查询性能更差)。

是的,你可以做到这一点。 你需要的诀窍是有两种方法从表服务器中获取表。 一种方法是..

 FROM TABLE A 

另一种方式是

 FROM (SELECT col as name1, col2 as name 2 FROM ...) B 

请注意,select子句和它周围的括号一个表,一个虚拟表。

所以,使用你的第二个代码示例(我猜你想在这里检索的列):

 SELECT a.attr, b.id, b.trans, b.lang FROM attribute a JOIN ( SELECT at.id AS id, at.translation AS trans, at.language AS lang, a.attribute FROM attributeTranslation at ) b ON (a.id = b.attribute AND b.lang = 1) 

请注意,您的真实表格attribute是此连接中的第一个表格,而我称为b这个虚拟表格是第二个表格。

当虚拟表是某种types的汇总表时,这种技术特别方便。 例如

 SELECT a.attr, b.id, b.trans, b.lang, c.langcount FROM attribute a JOIN ( SELECT at.id AS id, at.translation AS trans, at.language AS lang, at.attribute FROM attributeTranslation at ) b ON (a.id = b.attribute AND b.lang = 1) JOIN ( SELECT count(*) AS langcount, at.attribute FROM attributeTranslation at GROUP BY at.attribute ) c ON (a.id = c.attribute) 

看看这是怎么回事? 您已经生成了一个包含两列的虚拟表c ,将它们连接到另外两列,使用ON子句的一列,并将另一列作为结果集中的列返回。