помощь во внутреннем запросе на присоединение (получение категорий сообщений) - PullRequest
0 голосов
/ 29 августа 2011

Я создал небольшой скрипт на форуме

на моей странице индекса я использую

$query = mysql_query("SELECT * FROM threads");
while($threads = mysql_fetch_array($query)){
    echo 'Thread title ' . $threads['thread_title'];
    echo '<br />Thread content ' . $threads['thread'];
}

для распечатки полных постов сайта!

Теперь я хочу отобразить категорию и теги сообщений под заголовком

Как я могу получить категории и теги сообщения?

У меня есть таблица, содержащая эту информацию

имя таблицы -> отношения

столбцы

post_id | category_name

Я хочу присоединиться к этой таблице и получить category_name каждого сообщения!

так что это правильный запрос?

ПРИМЕЧАНИЕ: база данных моего сайта большая .. поэтому я хочу быстрый запрос

Большое спасибо

1 Ответ

1 голос
/ 29 августа 2011

Вы должны опубликовать список таблиц и полей, которые они содержат для данных, которые вы хотите видеть.

Но общая идея должна выглядеть примерно так (при условии, что у таблицы потоков есть внешний ключ на post_id к post_id таблицы отношений):

SELECT t.*, r.category_name FROM threads as t
INNER JOIN relations as r on t.thread_id = r.thread_id

Только что обновил вышеуказанный запрос на основе полей, которые вы только что перечислили.

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

Хорошо, в этом случае попробуйте что-то вроде этого:

SELECT t.*, GROUP_CONCAT(r.category_name ORDER BY r.category_name SEPARATOR " ") as category_name 
FROM threads as t
INNER JOIN relations as r on t.thread_id = r.thread_id
GROUP BY r.thread_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...