Чтобы получить много тегов для эффективного ответа от Postgres по PHP

Как вы можете получить много тегов для эффективного вопроса из базы данных Postgres PHP?

У меня есть теги таблиц и вопросы, где у меня есть переменные questions_question_id и question_id , соответственно, например.

Один вопрос может иметь много тегов. Я могу выбрать question_id , title и tag из таблиц. Тем не менее, я не знаю, как эффективно получить много тегов для одного вопроса из базы данных. PHP ограничивает меня манипулированием данными как матрицами.

Я могу прочитать question_id, title и tag для переменной $ result. Данные являются матрицей для меня в переменном $ result. Однако я не могу ссылаться на данные, подобные матрице.

Я только нашел функции pg_fetch_row и pg_fetch_all_columns в PHP. Первый получает данные как массивы для строк, а последние – как массивы для столбцов.

Моя проблема с LEFT JOIN подсказывает мне, что невозможно получить данные следующим образом

  1. получить столбцы для заголовка, question_id и tag
  2. группируйте данные с помощью question_id, чтобы я мог поставить теги на свои вопросы: я пытался манипулировать данными с помощью PHP, но я получаю только это .

Я думаю, что вам нужен второй запрос, который получает все теги для данного вопроса. Попытка присоединиться к ним вместе будет громоздкой. Это можно сделать, но в итоге у вас будет несколько строк с одинаковыми данными вопроса, но с разными тегами.

Итак, сначала сделайте что-нибудь подобное (я не знаю структуру вашей базы данных, поэтому это всего лишь пример):

 SELECT * FROM QUESTIONS WHERE ID = <id>; 

Затем вы делаете запрос сразу после этого, который запрашивает все теги:

 SELECT * FROM TAGS WHERE QUESTION_ID = <question_id>; 

Если вы жирный, вы можете реализовать агрегатную функцию в PostgreSQL, которая объединяет все соответствующие теги вместе для вас, а затем один запрос будет делать то, что вы хотите ™ .

 pg=> create aggregate ARRAY_ACCUM ( sfunc = array_append, basetype = anyelement, stype = anyarray, initcond = '{}' ); pg=> select QUESTIONS.ID as "QID", pg-> array_to_string(array_accum(TAG), ',') as "TAGS" pg-> from QUESTIONS pg-> left join TAGS on QUESTIONS.ID = TAGS.QID; QID | TAGS -----+--------------- 1 | foo, bar, baz 2 | foo, bar 3 | foo 4 | -- Reference, for completeness -- pg=> select * from QUESTIONS; id ---- 1 2 3 4 (4 rows) pg=> select * from TAGS; qid | tag -----+----- 1 | foo 1 | bar 1 | baz 2 | foo 2 | bar 3 | foo 

В MySQL эта функциональность называется GROUP_CONCAT . Под pg это называется «Сделай сам». 🙂 Теперь есть еще более тонкие способы обойти это и под pg. Проверьте этот умный пост в блоге и его комментарии, из которых я украл ^ Wadapted созданное create aggregate решение, предложенное выше. 🙂