Уточните свой поиск с общей суммой по каждому пункту. PHP с MysQL - PullRequest
2 голосов
/ 02 октября 2009

Каков наилучший способ сделать систему с «бегущим итогом», такую ​​как поиск по тегам в stackoverflow? Если я, например, нажму на «php», он покажет общее количество элементов в тегах «каждый», и это очень быстро. Как я могу сделать это в php с MySQL?

Ответы [ 2 ]

3 голосов
/ 02 октября 2009

Это запрос, который "выглядит" так

SELECT T2.Tag, COUNT(*)
FROM SO_Posts P1
JOIN Post_Tags T1 ON P.PostId = T1.PostId
JOIN Post_Tags T2 ON P.PostId = T2.PostId
GROUP BY T2.Tag
WHERE T1.Tag = 'PHP'
ORDER BY COUNT(*) DESC

Этот запрос делает правдоподобным предположение, что сообщения (вопросы) по SO хранятся в двух таблицах;
SO_Posts , содержащий одну запись для каждого сообщения и содержащую информацию, такую ​​как PostId (первичный ключ), сам вопрос, дата, заголовок и т. Д.
и
Post_Tags , который связывает данное сообщение (по его Post_Id) с тегом (или, более вероятно, с тегом TagId, поскольку теги должны быть нормализованы, но это деталь). Для данного сообщения в Post_Tags содержится столько записей, сколько к сообщению прикреплено различных тегов.
Примечание: в действительности структура базы данных SO Posts более сложная, с различными таблицами для хранения комментариев, ответов и т. Д., Но в отношении отношения «Пост-к-тегу» эта компоновка из двух таблиц (или, более вероятно, компоновка из 3 таблиц) разрешение иметь tagId в Post_Tags , а не в самом теге) отражает суть того, как можно, просто и быстро (при условии правильных индексов) показать эти отфильтрованные совокупные значения .

Идея состоит в том, чтобы найти все PostID, связанные с целевым тегом (здесь «PHP») (ищется в «T1»), а затем объединить все сообщения (в «T2») по тегу.

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

0 голосов
/ 02 октября 2009

Я думаю, они просто используют select count(*) from questions where tag = $tagname, который кэшируется в memcached. (<- важная часть) </p>

Как сказал комментатор, они могут также просто отслеживать количество тегов в отдельной таблице. Но вы не можете быть в этом уверены - все, что мы можем на самом деле сделать, это угадать. Это действительно сработало бы, но главное в том, что вы должны тестировать свое приложение, чтобы увидеть, какой подход вам подходит. Мы знаем, что количество тегов не в реальном времени, а ежечасно обновляется кроной в таблице или чем-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...