привет им просто любопытно. о том, как они делают вещи. что я предполагаю, что они делают что-то вроде этого
@someone1 im stacking on stackoverflow RT @someone2 : hello guys what are you doing?
прежде чем я сделаю это по-своему, я хочу рассказать вам о моей схеме базы данных
// CID = COMMENT ID, BID = BLOG ID, UID = USER ID CID BID UID COMMENT 1 1 1 @someone1 im stacking on stackoverflow RT @someone2 : .... 2 1 4 @someone1 im stacking on stackoverflow RT @someone2 : .... 3 1 12 @someone1 im stacking on stackoverflow RT @someone2 : ....
они используют regex, чтобы сделать это, чтобы взять имя @someones
preg_match_all("/@[a-zA-Z0-9_]+/", $text, $matches);
то они получают @ от каждого имени
foreach ($matches as $value) { foreach ($value as $value) { $usernames[] = substr($value, 1); } }
то они получают UID из базы данных, делая что-то вроде этого
foreach ($username as $value) { # insert database one by one ? so it will be like the example above }
то мы можем просто вывести комментарий, получив UID.
то как-то мы можем получить все комментарии в блоге. (без одного и того же комментария), where blog buid = 1
и дать им уведомление каждому пользователю, where uid = :uid
.
есть ли лучший способ сделать это? что-то вроде twitter или convore?
Спасибо, что посмотрели
Адам Рамадхан
Я сделал что-то подобное этому с помощью собственного приложения, которое мы используем для связи.
В принципе, у вас будут две таблицы: status_updates
и mentions
. В каждом обновлении состояния много упоминаний. Всякий раз, когда кто-то создает обновление статуса, вы сохраняете его в таблице status_updates
. Во время этого процесса вы также можете использовать Regex для обнаружения любого @username
«упоминания». Когда вы найдете упоминание, вы добавляете его в таблицу mentions
. Например, таблица mentions
может выглядеть примерно так:
mention_id (Auto-incrementing key) | status_message_id | username_id
Таким образом, если вы хотите узнать, упоминается ли кто-либо в сообщении о статусе, вы можете быстро просмотреть его в таблице status_messages
, в отличие от загрузки сообщения о статусе и запуска status_messages
. Другая приятная вещь об этом подходе заключается в том, что она позволяет вам иметь несколько упоминаний в каждом сообщении о состоянии. Просто создайте запись для каждого.
Это основной способ, которым мы его настроили.
EDIT: Если вы хотите вытащить «фид активности» для данного пользователя, показывая только обновления статуса, в которых они были упомянуты, это будет так же просто, как:
SELECT * FROM mentions m LEFT JOIN status_messages s ON m.status_message_id = s.id WHERE m.username_id = $username_id
Я должен отметить, что это не так, как они делают это в Twitter, потому что они имеют дело с проблемами масштаба, которые сделали бы этот простой способ делать вещи невозможными. Тем не менее, я думаю, что это самое простое решение, которое хорошо работает, если вы не беспокоитесь о масштабировании сотен тысяч пользователей. Если да, то у вас, вероятно, больше проблем на руках, чем на этом.
Вы можете использовать его как bb-коды, но вместо того, чтобы воспринимать его как [foo] [/ foo], вы берете @ и заканчиваете его в пространстве … прежде чем он вставляется в вашу базу данных, вы берете другой скрипт и разбиваете @ после пробела , и поместите упоминание в отдельный столбец, затем используйте bbcodes, чтобы сделать упоминание «на лету»
Пример..
if ( strstr("$status", "@") ) { $explodeat = explode("@", $status); $explodeat1 = explode(" ", $explodeat[1]); $status=$explodeat1[0]; }
и вставьте $ status в свой столбец упоминаний в вашей базе данных … Код BB для него после этого не будет таким сложным
Я думаю, что в MySQL вы можете использовать DISTINCT
чтобы избежать дублирования строк:
Что-то связать это:
SELECT `CID`, `BID`, DISTINCT `COMMENT` FROM comments WHERE UID = :uid AND ##Others clauses for bloc here##