一尘不染

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

mysql

基本上有属性表和翻译表-一个属性有很多翻译。

我需要从翻译中为指定属性的每个属性选择id和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和翻译,因此我可以连接列并在以后从字符串中获取ID,这至少使单个子查询更合理。

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

所以问题部分。有没有一种方法可以从单个子查询中获取多个列,或者我应该使用两个子查询(mysql足够聪明来对它们进行分组?),还是可以通过以下方式加入:

[[归因于语言]到翻译](连接3个表似乎比子查询的性能差)。


阅读 688

收藏
2020-05-17

共1个答案

一尘不染

是的,您可以这样做。您需要的诀窍是有两种将表从表服务器中移出的方法。一种方法是..

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是第二个表。

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

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子句,并将另一列作为结果集中的一列返回。

2020-05-17