Объединить содержимое нескольких строк в таблицах 3NF mysql

Прилежно нормализовав все мои данные, у меня возникла проблема с объединением строк 3NF в одну строку для вывода. До сих пор я делал это с кодированием на стороне сервера, но по разным причинам мне теперь нужно выбрать все строки, связанные с другой строкой, и объединить их в одну строку, все в MySQL...

Итак, чтобы попытаться объяснить:

У меня три стола.

  • Категории
  • Статьи
  • КатегорияСтатьи_3NF

Категория содержит CategoryID + заголовки, описания и т. д. Она может содержать любое количество статей в таблице Articles, состоящей из ArticleID + текстовое поле для размещения содержимого. Таблица CategoryArticles используется для связи между ними, поэтому содержит как CategoryID, так и ArticleID.

Теперь, если я выберу запись категории и присоединюсь к таблице статей через связывающую таблицу CategoryArticles_3NF, результатом будет отдельная строка для каждой статьи, содержащейся в этой категории. Проблема в том, что я хочу вывести одну строку для каждой категории, содержащую содержимое из всех статей внутри.

Если это звучит как нелепая просьба, это потому, что так оно и есть. Я просто использую статьи как хороший способ описать проблему. Мои данные на самом деле несколько другие.

В любом случае - единственный способ, которым я вижу это, - это использовать оператор 'GROUP_CONCAT' для группировки полей содержимого вместе. Проблема в том, что существует ограничение на количество данных, которые это может вернуть. , и мне нужно, чтобы он мог обрабатывать значительно больше.

Кто-нибудь может сказать мне, как это сделать?

Спасибо.


person Gary Stanton    schedule 14.01.2010    source источник


Ответы (1)


Это звучит как то, что должно быть сделано во внешнем интерфейсе без дополнительной информации.

При необходимости вы можете увеличить предельный размер GROUP_CONCAT, установив системную переменную group_concat_max_len. Он имеет ограничение, основанное на max_allowed_packet, которое вы также можете увеличить. Я думаю, что максимальный размер пакета составляет 1 ГБ. Если вам нужно подняться выше, то в вашем дизайне есть серьезные недостатки.

РЕДАКТИРОВАТЬ: Чтобы это было в ответе, а не просто похоронено в комментариях...

Если вы не хотите глобально изменять group_concat_max_len, вы можете изменить его только для своего сеанса с помощью:

SET SESSION group_concat_max_len = <your value here>
person Tom H    schedule 14.01.2010
comment
Обычно это делается во внешнем интерфейсе, но для этой конкретной проблемы мне нужно сделать это через MySQL. Я работаю на общем сервере и поэтому не имею доступа к изменению настроек group_concat_max_len или max_allowed_packet. Данные, вероятно, никогда не превысят 100 КБ. - person Gary Stanton; 14.01.2010
comment
Я считаю, что вы можете установить group_concat_max_len только для своего сеанса. Попробуйте SET SESSION group_concat_max_len = ‹ваше значение здесь› - person Tom H; 14.01.2010
comment
Вы правы, похоже, это работает... спасибо! В конце концов, поскольку время было фактором, я сделал это с кодированием на стороне сервера, а не с MySQL - это проблема производительности и, конечно, не то, как я хотел справиться с проблемой... но это не будет заметно на сервере. приложение этого размера. - person Gary Stanton; 15.01.2010