В этом запросе
SELECT username, (SELECT GROUP_CONCAT(color) FROM colors) FROM users WHERE id = 1;
Это лучший и единственный способ получить все colors
из colors
таблицы? Я не могу понять способ INDEX
таблицы colors
чтобы сделать ее быстрой, поэтому у меня есть свои проблемы.
users: id(int(11), Primary), username(varchar(12), Unique)
colors: id(int(11), Primary), color(varchar(12), Unique)
Ваш запрос в основном является единственным вариантом.
Вы можете переместить подзапрос в предложение FROM
. Это гарантирует, что он будет выполнен только один раз. Однако вы выбираете только одну строку, поэтому ее следует выполнять только один раз.
Почему вы думаете, что запрос медленный? Учитывая, что длина по умолчанию для group_concat()
составляет 1024 group_concat()
, вы не можете объединять это множество вместе.
Ну, есть еще один вариант:
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;
Я был бы удивлен, если бы это обеспечило лучшую производительность.
EXPLAIN
будет использовать Unique Key
или что-то в этом роде, но был удивлен, что это не так, поэтому у меня были опасения, что я делаю это неправильно, используя Subquery
. Я хотел бы понять, как это может быть перенесено в FROM
если это возможно.