Как вы можете получить много тегов для эффективного вопроса из базы данных 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 подсказывает мне, что невозможно получить данные следующим образом
Я думаю, что вам нужен второй запрос, который получает все теги для данного вопроса. Попытка присоединиться к ним вместе будет громоздкой. Это можно сделать, но в итоге у вас будет несколько строк с одинаковыми данными вопроса, но с разными тегами.
Итак, сначала сделайте что-нибудь подобное (я не знаю структуру вашей базы данных, поэтому это всего лишь пример):
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
решение, предложенное выше. 🙂