Запрос MySQL — получение списка «дополнительной» информации из таблицы соединений, аналогичной вложенному массиву

#php #mysql

#php #mysql

Вопрос:

Это было немного сложно объяснить в названии, но я должен быть в состоянии здесь. У меня есть две таблицы, которые выглядят следующим образом:

 Table 1:
    -id
    -created
    -last_modified
    -title

Table 2:
    -id
    -parent_id
    -type
    -value
  

Структура несколько похожа на следующую: элемент из таблицы one может иметь множество атрибутов, связанных с ним. Каждый атрибут указан во второй таблице со ссылкой на оригинал.

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу иметь возможность получать список записей из таблицы 1 для отображения в таблице (с использованием разбивки на страницы), но также хочу иметь возможность извлекать все атрибуты из таблицы 2, связанные с каждой записью таблицы 1, одновременно, чтобы я могесть следующее:

 (Table 1) ID1 [Title] has attributes x, y, z
(Table 1) ID2 [Title] has attributes x, y, z
(Table 1) ID3 [Title] has attributes x, y, z
  

и так далее. В идеале я хотел бы иметь возможность также связывать каждый атрибут с его типом … в настоящее время при объединении я получаю несколько строк одних и тех же записей (с разными объединенными данными каждый раз), и группировка их вместе полностью удаляет некоторые объединенные данные.

По сути, мне нужен массив атрибутов, которые должны быть возвращены для каждой записи из таблицы 1 (в некотором роде).

Я подумываю об использовании MongoDB для этого проекта, поскольку я знаю, что могу сделать это просто с помощью этого, но я пытаюсь сделать это с помощью MySQL, поскольку это то, что использует существующая платформа.

Надеюсь, я понял, о чем я спрашиваю 🙂 Любая помощь будет оценена!

Dan

Ответ №1:

Похоже, это скорее проблема с дисплеем. Объединенный запрос — это лучший способ сделать это. Затем у вас будет просто простой цикл в вашем коде извлечения / отображения для проверки при переходе от одной записи Table1 к другой и корректировки выходных данных по мере необходимости.

Вы могли бы получить все дочерние записи в виде отдельных полей, используя функцию group_concat() MySQL, но тогда вы просто получите (в основном) монолитную строку объединенных данных, а не отдельные записи, которые предоставит цикл joinedquery / display. group_concat также имеет ограничения по объему возвращаемых данных (по умолчанию 1024 байта), которые можно легко получить с большими наборами данных.

Комментарии:

1. Проблема в том, что если я пытаюсь показать 10 записей одновременно, выполнение поиска с помощью соединения приведет к получению 10 записей, но некоторые из них будут дубликатами данных — поэтому я подумал, есть ли другое решение. Я посмотрел на функцию group_concat, как вы упомянули, но, как вы сказали, она превращает данные в строку, с которой немного сложно иметь дело.

2. @Dan, разделение строки CSV не так сложно в коде более высокого уровня, 95% инструментов высокого уровня имеют встроенную поддержку для этого.

3. @Johan Да… Я больше осматривался и думаю, что мне придется использовать функциональность group_concat(), хотя сейчас я пытаюсь найти наилучший формат, который позволит мне представить его как key=>value .

4. В итоге мы пошли по пути group_concat(), поэтому отметили этот ответ как правильный