Mysql 使用子查询是在不相关的表上使用GROUP_CONCAT()的最佳方式吗?
在这个查询中Mysql 使用子查询是在不相关的表上使用GROUP_CONCAT()的最佳方式吗?,mysql,sql,query-optimization,Mysql,Sql,Query Optimization,在这个查询中 SELECT username, (SELECT GROUP_CONCAT(color) FROM colors) FROM users WHERE id = 1; 这是从表颜色中获取所有颜色的最佳且唯一的方法吗?我想不出一种方法来索引颜色表以使其快速,所以我有我的顾虑 users: id(int(11), Primary), username(varchar(12), Unique) colors: id(int(11), Primary), color(varchar(12)
SELECT username, (SELECT GROUP_CONCAT(color) FROM colors) FROM users WHERE id = 1;
这是从表颜色
中获取所有颜色的最佳且唯一的方法吗?我想不出一种方法来索引颜色表以使其快速,所以我有我的顾虑
users: id(int(11), Primary), username(varchar(12), Unique)
colors: id(int(11), Primary), color(varchar(12), Unique)
示例:您的查询基本上是唯一的选项
您可以将子查询移动到FROM
子句。这将保证它只执行一次。但是,您只选择了一行,因此应该只执行一次
你为什么认为查询速度慢?如果组的默认长度为1024个字符,则不能将这么多的值聚合在一起
嗯,还有一个选择:
select u.*, c.colors
from users u cross join
(select @c as colors
from (select @c := concat(@c, ',', c.color)
from colors c cross join
(select @c := '') params
) c
limit 1
) c
where u.id = 1;
如果这能提供更好的性能,我会感到惊讶。用您正在使用的数据库标记您的问题。样本数据和期望的结果也会有帮助。@GordonLinoff更新以添加样本和标签。去掉颜色中的id
;将color
提升为主键。(这不会解决问题。)@RickJames以前从未使用过PK,现在将检查它们的工作方式并听从您的建议。我希望解释使用唯一键或其他什么,但奇怪的是它没有,所以我担心我使用子查询做得不对。如果可能,我想了解如何将其从
移动到。