Это запрос, который "выглядит" так
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 здесь нет необходимости, но она, вероятно, будет частью запроса, например, для добавления дополнительных критериев, таких как, например, статус сообщения (не закрыто ...).