当前位置: 首页 > 面试题库 >

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

单于浩邈
2023-03-14
问题内容

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

我需要从翻译中为指定属性的每个属性选择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.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子句,并将另一列作为结果集中的一列返回。



 类似资料:
  • 问题内容: 我有一个具有以下字段的MySQL表: 其中父字段表示上层ID。例如,水果id是1,橙色是水果之一,因此父对象是1。 但是我想做一个有效的MySQL查询来获取所有记录,格式为parent-> children-> parent-> children格式。我怎样才能做到这一点? 查询的结果记录应类似于: 问题答案: 您需要mysql不支持的递归联接。您唯一可以做的就是确定最大深度(由于p-

  • 问题内容: 我所有的下午都花在尝试处理一个查询(或两个或三个)上,以获取三个表的所有子表的计数。看一下我的设计: 用户表 胜表 画表 输桌子 我试图得到这样的东西: 这是我的尝试: 问题答案: 这只是完成任务所需的工作量。

  • 问题内容: 我正在运行此查询 但这不是我想要的结果,它返回多行。 我的一张桌子看起来像这个名字: 另一个表看起来像这个名字: 我如何使其选择查询,以便可以从两个表中获取与之相关的所有值,并使它看起来像这样 所需的输出: 谢谢!(提前!) 问题答案: 为您提供所需的输出(但这并不灵活,因此,如果添加要输出的更多详细信息,将无法进行更改而不进行更改):-

  • 问题内容: 我有桌子: 我想写一个返回BookName,FirstName,LastName,RubricName的SELECT查询。 我有两个单独的查询,但我不知道如何在一个选择中编写此查询。这就是我得到的: 它工作正常,但如何在一个选择中编写? 我尝试这样做,但是不起作用: 它返回错误: 问题答案: 试试这个查询

  • 问题内容: 如何根据“ DateAdded”字段选择一个字段的使用天数? 例如: 问题答案: 使用: 参考:DATEDIFF DATEDIFF()返回expr1到expr2,表示为从一个日期到另一个日期的天数值。

  • 我试图使用JPA标准编写以下查询,但我无法选择子查询中的多列。 我陷入了下面的实现过程中,无法找到如何在子查询中选择多个列。请看我在代码中的评论(第三行)。 请帮我解决这个问题。