Является ли использование подзапроса лучшим способом использования GROUP_CONCAT () для не связанной таблицы?

0

В этом запросе

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)

Пример: http://sqlfiddle.com/#!9/064c34/2/0

  • 0
    Пометьте свой вопрос базой данных, которую вы используете. Образцы данных и желаемые результаты также будут полезны.
  • 0
    @GordonLinoff Обновлено, чтобы добавить образец и тег.
Показать ещё 2 комментария
Теги:
query-optimization

1 ответ

1
Лучший ответ

Ваш запрос в основном является единственным вариантом.

Вы можете переместить подзапрос в предложение 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;

Я был бы удивлен, если бы это обеспечило лучшую производительность.

  • 0
    Я ожидал, что EXPLAIN будет использовать Unique Key или что-то в этом роде, но был удивлен, что это не так, поэтому у меня были опасения, что я делаю это неправильно, используя Subquery . Я хотел бы понять, как это может быть перенесено в FROM если это возможно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню