SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 23.06.2011 16:40:21

beginner
Участник
Зарегистрирован: 23.06.2011
Сообщений: 4

Как выбрать рэндомом слово из текста?

Прошу помощи,

Есть поле title в таблице jos_content. Как сделать запрос в mysql для выборки любого слова из этого поля? но слово должно быть не менее 3-х символов длиной.
1. Сначала выбирается рэндомом поле id
2. Потом выбирается рэндомом одно слово из выборки пункта 1. Это слово должно быть более трех символов длиной.

Правильный код готов оплатить.

Неактивен

 

#2 23.06.2011 16:41:28

beginner
Участник
Зарегистрирован: 23.06.2011
Сообщений: 4

Re: Как выбрать рэндомом слово из текста?

Интересует код только sql, без php

Неактивен

 

#3 24.06.2011 13:51:19

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как выбрать рэндомом слово из текста?

CREATE TABLE `t_4415_jos_content` (
  `id` int(11) auto_increment,
  `title` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into `t_4415_jos_content`(`title`) values('a bc def ghik'),('4321 321 21 1'),('a1 b2c3 d4e5f6');
 

Предполагаем, что слова разделяются только пробелом.

1)
Либо меньше кода, но работать будет дольше (order by rand медленно работает)
SET @title = '';
select title into @title from t_4415_jos_content order by rand() limit 1;


Либо больше кода, но работать будет быстрее.

SET @row_count = 0, @rand_row = 0, @query = '', @id = 0, @title = '';
SELECT COUNT(*) INTO @row_count FROM `t_4415_jos_content`;
SET @rand_row = round(rand() * @row_count);
select if (@rand_row=@row_count,@rand_row:=@rand_row-1,0);
SET @query = CONCAT('SELECT id,title INTO @id,@title FROM `t_4415_jos_content` LIMIT ',@rand_row,', 1');
PREPARE zxc FROM @query;
EXECUTE zxc;


2)
select find_word(@title);


Код функции find_word:
DELIMITER $$

CREATE DEFINER=`deadka`@`%` FUNCTION `find_word`(title_ varchar(255)) RETURNS varchar(255) CHARSET utf8
    DETERMINISTIC
BEGIN
    DECLARE len INT UNSIGNED;
    DECLARE start_pos INT UNSIGNED;
    DECLARE end_pos INT UNSIGNED;
    DECLARE flg_finish BOOL;
   
    IF isnull(title_) THEN
        RETURN "";
    END IF;
   
    SET title_ = trim(title_);
   
    SET len = length(title_);
   
    IF len < 4 THEN
        RETURN "";
    END IF;
   
    SET start_pos = 1;
       
    SET flg_finish = FALSE;

    outer_find_loop: LOOP
   
        SET end_pos = start_pos;
       
        inner_find_loop: LOOP
            SET end_pos = end_pos + 1;
           
            IF (end_pos >= len) THEN
                    SET flg_finish = TRUE;
                    LEAVE inner_find_loop;
            END IF;
           
            IF SUBSTR(title_, end_pos, 1 ) = ' ' THEN
                LEAVE inner_find_loop;
            END IF;
        END LOOP inner_find_loop;
       
        IF (flg_finish = TRUE) THEN
            IF ( end_pos - start_pos >= 3 ) THEN
                RETURN SUBSTR(title_, start_pos);
            END IF;
            RETURN "";
        END IF;
       
        IF ( end_pos - start_pos > 3 ) THEN
            RETURN SUBSTR(title_, start_pos, end_pos - start_pos);
        END IF;
       
        SET start_pos = end_pos + 1;
        WHILE  SUBSTR(title_, start_pos, 1) = ' ' DO
            SET start_pos = start_pos + 1;
        END WHILE;
       
    END LOOP outer_find_loop;
   
    return "";
END
 

Отредактированно deadka (24.06.2011 13:53:53)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 24.06.2011 20:25:53

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Как выбрать рэндомом слово из текста?

deadka написал:

DELIMITER $$

CREATE DEFINER=`deadka`@`%` FUNCTION `find_word`(title_ varchar(255)) RETURNS varchar(255) CHARSET utf8
    DETERMINISTIC
BEGIN
    DECLARE len INT UNSIGNED;
    DECLARE start_pos INT UNSIGNED;
    DECLARE end_pos INT UNSIGNED;
    DECLARE flg_finish BOOL;
   
    IF isnull(title_) THEN
        RETURN "";
    END IF;
   
    SET title_ = trim(title_);
   
    SET len = length(title_);
   
    IF len < 4 THEN
        RETURN "";
    END IF;
   
    SET start_pos = 1;
       
    SET flg_finish = FALSE;

    outer_find_loop: LOOP
   
        SET end_pos = start_pos;
       
        inner_find_loop: LOOP
            SET end_pos = end_pos + 1;
           
            IF (end_pos >= len) THEN
                    SET flg_finish = TRUE;
                    LEAVE inner_find_loop;
            END IF;
           
            IF SUBSTR(title_, end_pos, 1 ) = ' ' THEN
                LEAVE inner_find_loop;
            END IF;
        END LOOP inner_find_loop;
       
        IF (flg_finish = TRUE) THEN
            IF ( end_pos - start_pos >= 3 ) THEN
                RETURN SUBSTR(title_, start_pos);
            END IF;
            RETURN "";
        END IF;
       
        IF ( end_pos - start_pos > 3 ) THEN
            RETURN SUBSTR(title_, start_pos, end_pos - start_pos);
        END IF;
       
        SET start_pos = end_pos + 1;
        WHILE  SUBSTR(title_, start_pos, 1) = ' ' DO
            SET start_pos = start_pos + 1;
        END WHILE;
       
    END LOOP outer_find_loop;
   
    return "";
END
 

Не понял с помощью чего именно тут выбирается случайное слово ?

select title into @title from t_4415_jos_content order by rand() limit 1;

Если в title не будет ни одного слова больше 2 символов то у вас  проблема.

Не знаю если для вас важно, случайность тут получается совсем не равномерная.
Пример:
записи "kuku sd" и "test wedf fgfdghj hjkjhk fffg ghjgjhg ghjhgjghj dgdgfdg fgfdsf fdsgd" 
У слова "kuku" в 10 раз больше шанса появится чем у "test".

Правильный код готов оплатить.

Для правильного кода нужна правильная структура.

Правильная структура это разобрать ваши тексты на части.
ID   |  CONTENT
-----|---------------------------------
233 | a1 b2c3 d4e5f6 fgfdg

ID   | WORD
-----|---------------------------------
233 | b2c3
233 | d4e5f6
233 | fgfdg

Пореж те старые данные, новые режте на лету и вносите в дополнительную таблицу.

Отредактированно evgeny (24.06.2011 21:34:29)

Неактивен

 

#5 24.06.2011 22:54:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как выбрать рэндомом слово из текста?

evgeny написал:

Не понял с помощью чего именно тут выбирается случайное слово ?[/qoute]

beginner написал:

Как сделать запрос в mysql для выборки любого слова из этого поля? но слово должно быть не менее 3-х символов длиной.

Здесь выбирается не случайное, а первое слово, в котором больше трех букв. Первое слово вполне подходит под требование "любое" smile.

evgeny написал:

select title into @title from t_4415_jos_content order by rand() limit 1;
Если в title не будет ни одного слова больше 2 символов то у вас  проблема.

Какая проблема? Функция в этом случае просто вернет пустую строку.

mysql> select find_word('ab ab');
+--------------------+
| find_word('ab ab') |
+--------------------+
|                    |
+--------------------+
1 row in set (0.00 sec)

evgeny написал:

Для правильного кода нужна правильная структура.

Правильная структура это разобрать ваши тексты на части.
ID   |  CONTENT
-----|---------------------------------
233 | a1 b2c3 d4e5f6 fgfdg

ID   | WORD
-----|---------------------------------
233 | b2c3
233 | d4e5f6
233 | fgfdg

Пореж те старые данные, новые режте на лету и вносите в дополнительную таблицу.

Тут согласен smile.

Отредактированно deadka (24.06.2011 22:55:17)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson