64の異なるフィールドで構成されるテーブルがあります。単一のキーワードで検索します。結果はどのフィールドのキーワードにも一致するはずです。いくつかの提案をします。
SELECT * FROM `some_table`
WHERE
CONCAT_WS('|',`column1`,`column2`,`column3`,`column4`,`column64`) # single condition, many columns
LIKE '%VT%'
出来上がり。
「|」ところで、セパレータは、たとえばcolumn1が 'V'で終わり、column2が 'T'で始まる偶然の一致を見つけないようにすることです。これにより、 "VT"の検索で誤検知が発生します。
上記のメソッドがOR
メソッドよりも速いかどうかはわかりませんが(同じ速度だと思います)、クエリを手書きで書いている場合は、タイピングが少なくなります。
OR
を使用して複数の条件でwhereを使用できます
お気に入り
where
name = 'expected'
OR rate ='expected'
OR country ='expected'
私はあなたのクエリが単純だが長い方法を回避する方法を見ることができません:
SET @term = "Somesearch";
SELECT id, title FROM sometable WHERE
col1 LIKE '%@term%' OR
col2 LIKE '%@term%' OR
col3 LIKE '%@term%' ...;
MySQL変数を使用する代わりに、言語固有の変数を使用できますが、例のために、MySQL自体に固執すると思いました。
「...」は、他の61の列/フィールドを配置する場所です。
別の可能性は、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%'
特に大きなテーブルの場合、実行に時間がかかる場合がありますが、その文字列が特定のテーブルに存在するかどうかを徹底的に確認する必要があります。
最も簡単な解決策は、複数のORs
を使用することです。
select * from TAB where col1 like "%VAR%" OR col2 like "%VAR%" OR......col64 like "%VAR%";
要件に応じてlike
または=
を使用できますが、新しい列を追加するたびにクエリを変更する必要があります。
別の方法として、SQLDump for that table
を取得してから、そのファイルをsearch
で取得することもできます。
グーグルで、
このプロジェクトが有用かどうかを確認します- http://code.google.com/p/anywhereindb/ 。すべてのフィールドを検索し、多くの人から賞賛されています。
information_schema
テーブルの情報を使用してみてください。テーブル内のすべての列を探します。次に、この情報を使用してクエリを作成してみます。
このSQL Server構文をMySQLに変換できる場合
WHERE
name = @keyword OR
country = @keyword OR
department = @keyword OR
@keyword IS NULL -- match all when search text is empty
テーブル内のすべての列に対してクエリを生成するクエリを1つ作成できます。以下の例では、スキーマ(「所有者」)は「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';
この1つのクエリは、各フィールドのクエリを生成します。上記を実行した結果は次のようになります。
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
次に、最初のクエリから生成されたクエリを別のタブに貼り付けて実行します。
お役に立てば幸いです。 :-)
動的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');