Я знаю, что этот вопрос задавался несколько раз (однако я все еще не мог найти решение):
Основной вопрос: наличие таблиц сообщений , комментариев , пользователь … можете ли вы с одним синтаксисом выбрать и показать все сообщения и все комментарии (с комментарием comment.text, comment.timestamp)? Как бы выглядел такой выбор? Если нет, то какое самое простое решение?
Я также попытался JOIN
к таблице comments
таблицей posts
и использовать GROUP BY
, но я получил либо только один комментарий в каждой строке, либо каждый комментарий, но также и эти сообщения несколько раз !?
Я попробовал решение первой ссылки (вложенную mysql_query, а затем выборку), а также вторую ссылку (с массивами). Однако первый из них вызвал множество ошибок (синтаксис в этом сообщении кажется неправильным, и я не мог понять, как его решить), а во втором у меня были проблемы с массивами.
Мой запрос выглядит так:
SELECT p.id, p.title, p.text, u.username, c.country_name, (SELECT SUM(vote_type) FROM votes v WHERE v.post_id = p.id) AS sum_vote_type FROM posts p LEFT JOIN user u ON ( p.user_id = u.id ) LEFT JOIN countries c ON ( c.country_id = u.country_id ) ORDER BY $orderby DESC
Мне было интересно, не слишком ли распространен этот вопрос, когда есть сообщения и комментарии, чтобы показать …?
Спасибо за любую помощь заранее!
Не зная структуру базы данных, она должна выглядеть примерно так. Обратите внимание, что вы должны заменить символы *
более явным списком столбцов, которые вам действительно нужны.
SELECT p.*, c.*, u.* FROM posts p LEFT JOIN comments c ON c.post_id = p.id LEFT JOIN users u ON u.id = p.author_id
Обратите внимание, что если вы просто пытаетесь получить подсчеты, суммы и тому подобное, рекомендуется кэшировать часть этой информации. Например, вы можете захотеть кэшировать счетчик комментариев в таблице сообщений, а не подсчитывать их каждый запрос. Учитывайте и обновляйте счетчик комментариев при добавлении / удалении комментария.
EDIT: осознал, что вы также хотели прикрепить данные пользователя к каждому комментарию. Вы можете ПРИСОЕДИНИТЬСЯ к одному и тому же столу несколько раз, но он становится уродливым. Это может стать очень дорогостоящим запросом. Я также включаю пример того, как столбцы псевдонимов, чтобы он был менее запутанным:
SELECT p.*, c.*, u.name as post_author, u2.name as comment_author FROM posts p LEFT JOIN comments c ON c.post_id = p.id LEFT JOIN users u ON u.id = p.author_id LEFT JOIN users u2 ON u2.id = c.author_id