Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: MySQL. Поиск строки по всей базе.  (Прочитано 129831 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« : 03-12-2009 20:37 » 

Обсуждение статьи: «MySQL. Поиск строки по всей базе.»
« Последнее редактирование: 01-08-2011 15:01 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
manager
Новенький

ua
Offline Offline

« Ответ #1 : 19-07-2017 12:31 » 

MySQL. Поиск строки по всей базе.

Добрый день! Нужна ваша помощь. Хочу с помощью приведенного вами кода вернуть общее кол-во найденных вхождений. Проблема в том, что не понимаю как вытащить(объеденить) результаты после того как ваша процедура отработала.
Вот слегка доработал под свои нужды ваше решение.
Код:
DROP PROCEDURE IF EXISTS find_overall;
delimiter $$
CREATE PROCEDURE find_overall(
  p_dbname VARCHAR(64),
  p_search VARCHAR(255)
)
BEGIN
  DECLARE search_string VARCHAR(512);
  DECLARE table_name VARCHAR(64);
  DECLARE column_name VARCHAR(64);
  DECLARE selections TEXT;
  DECLARE conditions TEXT;
  DECLARE eof BOOL;
  DECLARE curs_tables CURSOR FOR
    SELECT DISTINCT c.table_name
    FROM information_schema.columns c
    WHERE c.table_schema = p_dbname
      AND c.data_type IN (
        'char', 'varchar', 'binary', 'varbinary',
        'tinytext', 'text', 'mediumtext', 'longtext',
        'tinyblob', 'blob', 'mediumblob', 'longblob'
      );
  DECLARE curs_columns CURSOR FOR
    SELECT c.column_name
    FROM information_schema.columns c
    WHERE c.table_schema = p_dbname
      AND c.table_name = table_name
      AND c.data_type IN (
        'char', 'varchar', 'binary', 'varbinary',
        'tinytext', 'text', 'mediumtext', 'longtext',
        'tinyblob', 'blob', 'mediumblob', 'longblob'
      );
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET eof = TRUE;

  SET search_string = QUOTE(p_search);
  SET search_string = SUBSTR(search_string, 2, LENGTH(search_string) - 2);

  OPEN curs_tables;
  SET eof = FALSE;

  L_tables: LOOP
    FETCH curs_tables INTO table_name;

    IF eof THEN LEAVE L_tables; END IF;

    OPEN curs_columns;
    SET selections = '';
    SET conditions = '';

    L_columns: LOOP
      FETCH curs_columns INTO column_name;

      IF eof THEN LEAVE L_columns; END IF;

      SET selections = CONCAT(selections,
        IF(selections = '', '', ', '),
        'IF(`', column_name, '` LIKE "%', search_string, '%", `', column_name, '`, NULL)',
        ' `', column_name, '`'
      );
      SET conditions = CONCAT(conditions,
        IF(conditions = '', '', ' OR '),
        '`', column_name, '` LIKE "%', search_string, '%"'
      );
    END LOOP;

    CLOSE curs_columns;
    SET eof = FALSE;

    SET @stm = CONCAT(
      'SELECT COUNT(*)
       FROM `', p_dbname, '`.`', table_name, '`',
      ' WHERE ', conditions
    );
    PREPARE find_overall FROM @stm;
    EXECUTE find_overall;
    DROP PREPARE find_overall;
  END LOOP;

  CLOSE curs_tables;
END;$$
delimiter ;

Если это выполнить, то на выходе будет множество count(*) результатов и я не знаю как мне это объеденить в один результат.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 06-08-2017 18:07 » 

см. в документации на MySQL: SELECT INTO
Просуммируй результат всех вызовов. Возврат возможен так: либо через параметр OUT в переменную сессии типа @имя, либо через SELECT и тогда это будет вторым результатом.
« Последнее редактирование: 06-08-2017 18:11 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines