У меня есть таблица, состоящая из 64 разных полей. я собираюсь искать с одним ключевым словом в нем, результаты должны соответствовать ключевому слову из любого поля. Дайте несколько советов.
Искать все столбцы таблицы, используя сингл, где условие с единственным ключевым словом в mysql
Ответ 1
SELECT * FROM `some_table`
WHERE
CONCAT_WS('|',`column1`,`column2`,`column3`,`column4`,`column64`) # single condition, many columns
LIKE '%VT%'
Voila.
"|" разделитель, кстати, должен помешать вам найти совпадающие совпадения, где, например, столбец 1 заканчивается на 'V', а столбец2 начинается с 'T', что даст вам ложный положительный результат при поиске "VT".
Я не уверен, что выше описанный метод быстрее, чем метод OR
(я бы предположил, что они имеют одинаковую скорость), но он определенно требует меньшего набора текста, если вы пишете запрос вручную.
Ответ 2
вы можете использовать где с несколькими условиями с OR
like
where
name = 'expected'
OR rate ='expected'
OR country ='expected'
Ответ 3
Я не вижу, чтобы ваш запрос был простым, но длинным:
SET @term = "Somesearch";
SELECT id, title FROM sometable WHERE
col1 LIKE '%@term%' OR
col2 LIKE '%@term%' OR
col3 LIKE '%@term%' ...;
Вместо использования переменной MySQL вы можете просто использовать переменную, специфичную для языка, но, ради примеров, я думал, что буду придерживаться самого MySQL.
"..." - это место, где вы поместите остальные 61 столбец/поля.
Ответ 4
Еще одна возможность - использовать FOR XML для получения всех столбцов для печати в одном поле... например:
SELECT c.*
FROM (
SELECT a.*
,( SELECT *
FROM table_to_search b
WHERE a.KeyField = b.KeyField
FOR XML RAW) AS `Full_Text_Record`
FROM table_to_search a) c
WHERE c.`Full_Text_Record` LIKE '%Search_string%'
Может потребоваться некоторое время, если оно является особенно большой таблицей, но нужно грубо заставить вас выяснить, существует ли эта строка в любой таблице.
Ответ 5
Простейшим решением было бы использовать несколько ORs
.
select * from TAB where col1 like "%VAR%" OR col2 like "%VAR%" OR......col64 like "%VAR%";
Вы можете использовать like
или =
в соответствии с требованием, но это потребует изменить ваш запрос каждый раз, когда вы добавляете новый столбец.
В качестве альтернативы вы можете взять SQLDump for that table
, а затем search
этот файл.
С некоторым Googling,
-
Посмотрите, полезен ли этот проект - http://code.google.com/p/anywhereindb/. Ищет все поля и похвалил многих.
-
Попробуйте использовать информацию из таблицы
information_schema
. Найдите все столбцы в таблице. Теперь попробуйте сформировать свой запрос, используя эту информацию.
Ответ 6
Если вы можете перевести этот синтаксис SQL Server в MySQL
WHERE
name = @keyword OR
country = @keyword OR
department = @keyword OR
@keyword IS NULL -- match all when search text is empty
Ответ 7
Можно написать один запрос, который будет генерировать запрос для каждого столбца в вашей таблице. В приведенном ниже примере схема ( "владелец" ) является "DEV_USER" Таблица с вашими 64 полями называется "CUSTOMER_INFO" Критерии поиска - это любой столбец со значением "VT" в нем:
select 'SELECT ' || COLUMN_NAME || ' FROM CUSTOMER_INFO
WHERE ' || COLUMN_NAME || q'# LIKE '%VT%';#'
FROM ALL_TAB_COLS
WHERE OWNER = 'DEV_USER'
AND TABLE_NAME = 'CUSTOMER_INFO';
Этот запрос будет генерировать запрос для каждого поля для вас. Результатом выполнения вышеуказанного будет:
SELECT ADDRESS_1 FROM CUSTOMER_INFO
WHERE ADDRESS_1 LIKE '%VT%';
SELECT ADDRESS_2 FROM CUSTOMER_INFO
WHERE ADDRESS_2 LIKE '%VT%';
SELECT CITY FROM CUSTOMER_ADDRESSES_QASB
WHERE CITY LIKE '%VT%';
SELECT STATE_PROVINCE FROM CUSTOMER_INFO
WHERE STATE_PROVINCE LIKE '%VT%';
SELECT ZIP_POSTAL_CODE FROM CUSTOMER_INFO
WHERE ZIP_POSTAL_CODE LIKE '%VT%';
WHERE LATITUDE LIKE '%VT%';
... and so on for each column in the table
Затем вы просто вставляете те запросы, которые были сгенерированы из вашего первого запроса, на другую вкладку и запускайте их.
Надеюсь, что это поможет.: -)
Ответ 8
Вы можете использовать динамический SQL для генерации и выполнения запроса, который ищет все столбцы.
DELIMITER $$
CREATE PROCEDURE searchAllCols(inDB VARCHAR(64), inTable VARCHAR(64), search VARCHAR(32))
BEGIN
SET @matches = (
SELECT GROUP_CONCAT(CONCAT(''', COLUMN_NAME, '' LIKE "%', search, '%"') SEPARATOR ' OR ')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = inTable and table_schema = inDB);
SET @query = CONCAT('SELECT * FROM '', inDB, ''.'', inTable, '' WHERE ', @matches);
PREPARE stmt FROM @query;
EXECUTE stmt;
END
$$
DELIMITER ;
CALL searchAllCols('table_to_search', 'searchString');