从 MySQL 中的子查询中选择多个列
您有一个场景,您需要检索每个属性的 id 和值(翻译)以指定语言。但是,某些属性可能没有给定语言的翻译。
子查询的性能注意事项
一种方法是对每列使用子查询,如示例中所示:
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;
虽然这种方法有效,但如果 MySQL 无法优化子查询,则会引发性能问题。
使用虚拟表
更有效的解决方案是利用虚拟表。通过将子查询括在括号中,我们可以创建一个虚拟表,该虚拟表可以连接到查询中的其他表。
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)
在此示例中,虚拟表 b 包含来自attributeTranslation 表,连接到属性表 a。这消除了对多个子查询的需要并提高了性能。
结论
利用虚拟表可以有效地从子查询中选择多个列,同时还提供了创建子查询的灵活性复杂的连接操作。在处理性能问题时,这种方法特别有用。
以上是MySQL如何高效地从子查询中选择多列?的详细内容。更多信息请关注PHP中文网其他相关文章!