webentwicklung-frage-antwort-db.com.de

Durchsuchen Sie alle Spalten einer Tabelle mit einer einzigen where-Bedingung mit einem einzigen Schlüsselwort in mysql

Ich habe eine Tabelle, die aus 64 verschiedenen Feldern besteht. Ich werde mit einem einzigen Schlüsselwort darin suchen. Die Ergebnisse sollten mit dem Schlüsselwort aus jedem Feld übereinstimmen. Gib einige Vorschläge.

22
R J.
SELECT * FROM `some_table`
WHERE
CONCAT_WS('|',`column1`,`column2`,`column3`,`column4`,`column64`) # single condition, many columns
LIKE '%VT%'

Voila.

Das '|' Das Trennzeichen dient übrigens dazu, zu verhindern, dass Sie zufällige Übereinstimmungen finden, bei denen beispielsweise Spalte1 mit 'V' endet und Spalte2 mit 'T' beginnt, wodurch Sie bei der Suche nach "VT" ein falsch positives Ergebnis erhalten.

Ich bin mir nicht sicher, ob die obige Methode schneller als die OR-Methode ist (ich würde vermuten, dass sie dieselbe Geschwindigkeit hat), aber es ist definitiv weniger Tipparbeit nötig, wenn Sie die Abfrage von Hand schreiben.

10
Buttle Butkus

sie können das Where mit mehreren Bedingungen mit OR verwenden.

mögen 

where
name = 'expected'
OR rate ='expected' 
OR country ='expected'
5
NullPoiиteя

Ich kann keinen einfachen Weg für Ihre Abfrage sehen, der jedoch lang ist:

SET @term = "Somesearch";
SELECT id, title FROM sometable WHERE
    col1 LIKE '%@term%' OR
    col2 LIKE '%@term%' OR
    col3 LIKE '%@term%' ...;

Anstatt eine MySQL-Variable zu verwenden, können Sie einfach eine sprachspezifische Variable verwenden, aber für Beispiele wollte ich bei MySQL selbst bleiben.

Das "..." ist, wo Sie die anderen 61 Spalten/Felder platzieren würden.

2
tdlm

Eine andere Möglichkeit wäre, FOR XML zu verwenden, damit alle Spalten in einem einzigen Feld gedruckt werden ...

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%'

Es kann eine Weile dauern, bis es ausgeführt wird, wenn es sich um eine besonders große Tabelle handelt, aber es sollte Sie mit aller Kraft herausfinden, ob diese Zeichenfolge in einer bestimmten Tabelle vorhanden ist.

2
processoriented

Die einfachste Lösung wäre die Verwendung mehrerer ORs.

select * from TAB where col1 like "%VAR%" OR col2 like "%VAR%" OR......col64 like "%VAR%";

Sie können je nach Anforderung like oder = verwenden. Die Abfrage muss jedoch jedes Mal geändert werden, wenn Sie eine neue Spalte hinzufügen.

Alternativ können Sie SQLDump for that table und dann search diese Datei verwenden.

Mit etwas googeln, 

  1. Prüfen Sie, ob dieses Projekt nützlich ist - http://code.google.com/p/anywhereindb/ . Durchsucht alle Felder und wird von vielen gelobt.

  2. Versuchen Sie, die Informationen aus der information_schema-Tabelle zu verwenden. Suchen Sie nach allen Spalten in der Tabelle. Versuchen Sie nun, Ihre Abfrage mit diesen Informationen zu bilden.

1

Wenn Sie diese SQL Server-Syntax in MySQL übersetzen können

WHERE
name = @keyword OR
country = @keyword OR
department = @keyword OR
@keyword IS NULL -- match all when search text is empty
1
codingbiz

Sie könnten eine Abfrage schreiben, die für jede Spalte in Ihrer Tabelle eine Abfrage generiert. Im Schema unten ("owner") ist "DEV_USER" .__ Die Tabelle mit Ihren 64 Feldern heißt "CUSTOMER_INFO" Das Suchkriterium ist eine Spalte mit dem Wert "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'; 

Diese eine Abfrage generiert eine Abfrage für jedes Feld für Sie. Die Ergebnisse der Ausführung des obigen Beispiels wären:

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

Dann fügen Sie einfach die aus Ihrer ersten Abfrage generierten Abfragen in eine andere Registerkarte ein und führen Sie sie aus.

Hoffentlich hilft das. :-)

0
user2569747

Sie können Dynamic SQL verwenden, um eine Abfrage zu generieren und auszuführen, die alle Spalten durchsucht.

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);
    PREPARE stmt FROM CONCAT('SELECT * FROM `', inDB, '`.`', inTable, '` WHERE ', @matches);
    EXECUTE stmt;
END
$$
CALL searchAllCols('table_to_search', 'searchString');
0
Barmar