В моей базе данных есть таблица сообщений с 3 полями: ‘messageid’,messagetext (varchar)
, dateposted (datetime)
Я хочу хранить кучу сообщений в поле messagetext
вместе с соответствующей датой размещения в поле dateposted
, Многие из этих сообщений будут иметь hashtags
в них.
Затем, используя PHP и MySQL, я хочу выяснить, какие хэштеги входят в пятерку наиболее часто упоминаемых hashtags
в сообщениях, размещенных на прошлой неделе.
Как я могу это сделать? Буду очень признателен за любую помощь. Спасибо заранее.
Не поймите меня неправильно, но вы настроили себя на мир боли. Лучший способ продолжить было бы следовать совету одинокого дня и разбирать хэштеги во время вставки. Это также значительно сокращает время обработки и делает его более детерминированным (рабочая нагрузка «распределяется» между вставками).
Если вы все равно хотите продолжить, вам нужно решить несколько проблем.
1) Распознать теги.
2) Многократный выбор тегов. Если у вас есть сообщение о том, что «#MySQL-разбиение #cool», вы хотите получить два строки из этого одного сообщения, одно говорит «MySQL», другое «круто».
3) Выбор соответствующих сообщений
4) Выступления
Вы можете подойти к этому как минимум двумя способами. Вы можете использовать сохраненная функция , который вы найдете здесь на ТАК (на самом деле из этот сайт) — вам придется изменить его, хотя.
Этот синтаксис даст вам первое вхождение #hashtag в value
плюс весь текст, следующий за ним:
select substring(value, LENGTH(substring_index(value, '#', 1))+1);
Затем вам нужно будет решить, где для каждого #hashtag это #stops. (И это может быть #parenthesized). На этом этапе вам нужно регулярное выражение или для поиска последовательности по крайней мере одного буквенно-цифрового символа — на языке регулярных выражений, [a-zA-Z0-9]+
— указав все возможные символы или используя цикл, то есть «#» в порядке, «#t» в порядке, «#ta» в порядке, «#tag» в порядке, «#tag» — нет, и поэтому ваш Хэштегом является «#tag» (или «тег»).
Еще один более перспективный подход заключается в использовании пользовательская функция захватывать хэштеги; ты можешь использовать PREG_CAPTURE
.
Вам, вероятно, придется объединить оба подхода: изменить настройки хранимой функции и внутренний цикл для чтения
DECLARE cur1 CURSOR FOR SELECT messages.messagetext
FROM messages
WHERE messages.messagetext LIKE '%#%';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
DROP TEMPORARY TABLE IF EXISTS table2;
CREATE TEMPORARY TABLE table2( hashtag` VARCHAR(255) NOT NULL
) ДВИГАТЕЛЬ = Память;
...
SET occurrence = (SELECT LENGTH(msgtext)
- LENGTH(REPLACE(msgtext, '#, ''))
+1);
SET i=1;
WHILE i <= occurrence DO
INSERT INTO table2 VALUES SELECT PREG_CAPTURE('/#([a-z0-9]+)/i', messagetext, occurrence));
SET i = i + 1;
END WHILE;
...
Это вернет список идентификаторов сообщений и хэштегов. Затем вам нужно GROUP
их BY
хэштег, посчитай их и ORDER
по количеству DESC
наконец добавив LIMIT 5
чтобы получить только пять самых популярных.
Других решений пока нет …