在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个表似乎比子查询的性能差)。
回答:
是的,您可以这样做。您需要的诀窍是有两种将表从表服务器中移出的方法。一种方法是..
FROM TABLE A
另一种方法是
FROM (SELECT col as name1, col2 as name 2 FROM ...) B
请注意,select子句及其周围的括号 是 一个表,一个虚拟表。
因此,使用您的第二个代码示例(我猜您希望在此处检索的列):
SELECT a.attr, b.id, b.trans, b.langFROM 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.langcountFROM 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
子句,并将另一列作为结果集中的一列返回。
以上是 在MySQL子查询中选择多个列/字段 的全部内容, 来源链接: utcz.com/qa/425889.html