2012-09-23 5 views
21

Ich habe eine Tabelle, die aus 64 verschiedenen Feldern besteht. Ich werde mit einem einzelnen Schlüsselwort darin suchen, Ergebnisse sollten das Schlüsselwort von irgendeinem Feld zusammenbringen. Gib einige Vorschläge.Durchsuchen Sie alle Spalten einer Tabelle mit einer einzigen where-Bedingung mit einem Schlüsselwort in mysql

+4

vergessen Sie nicht, klicken Sie auf das Häkchen und Upvote Antworten, die Ihnen geholfen haben. –

+0

^Ich stimme völlig zu und habe ähnliche Gedanken :) – instanceOfObject

+0

wähle * von * wo * wie% sucher_text%. Ist das möglich ??? –

Antwort

5

können Sie die in dem mit mehreren Bedingung verwenden, um mit OR

wie

where 
name = 'expected' 
OR rate ='expected' 
OR country ='expected' 
+0

Wenn ich ODER verwende, muss ich alle 64 Felder verwenden. Gibt es dafür noch eine andere Lösung? –

+0

Haben Sie meine Lösungen im selben Post überprüft? – instanceOfObject

+0

@instanceOfObject was !!!! was willst du sagen?? –

2

ich nicht einen Weg, um Ihre Frage ist einfach, aber lange sehen:

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

statt Wenn Sie eine MySQL-Variable verwenden, können Sie einfach eine sprachspezifische Variable verwenden, aber aus Gründen der Beispiele dachte ich, ich würde bei MySQL bleiben.

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

+0

Dies ist eine winzige Syntax, muss aber loooooooooong Codes schreiben :) –

1

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 like oder = nach der Anforderung verwenden, aber es erfordert Ihre Abfrage jedes Mal, wenn Sie eine neue Spalte hinzufügen, ändern.

Als Alternative können Sie SQLDump for that table und dann search diese Datei nehmen.

Mit etwas googeln,

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

  2. Versuchen Sie, die Informationen aus information_schema Tabelle zu verwenden. Suchen Sie nach allen Spalten in der Tabelle. Versuchen Sie nun, Ihre Abfrage mithilfe dieser Informationen zu erstellen.

1

Wenn Sie diese SQL Server-Syntax MySQL übersetzen kann

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

Sie könnten eine Abfrage schreiben, die eine Abfrage für jede Spalte in der Tabelle generieren. Im Beispiel unter dem Schema („Eigentümer“ genannt) ist ‚DEV_USER‘ Die Tabelle mit 64 Feldern ‚customer_info‘ Die Kriterien bei der Suche aufgerufen wird, ist jede Spalte mit einem Wert von ‚VT‘ drin:

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 oben genannten wäre;

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 Abfragen, die von Ihrer ersten Abfrage erzeugt wurden, in eine andere Registerkarte ein und führen sie aus.

Hoffe, dass hilft. :-)

+1

Unglaublich ineffizient. –

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

Voila.

Das '|' Das Trennzeichen soll übrigens verhindern, dass zufällige Übereinstimmungen gefunden werden, bei denen beispielsweise Spalte 1 in "V" endet und Spalte 2 mit "T" beginnt, was bei einer Suche nach "VT" ein falsches positives Ergebnis liefern würde.

Ich bin mir nicht sicher, ob die oben genannte Methode schneller als die OR Methode ist (ich denke, sie sind die gleiche Geschwindigkeit), aber es erfordert definitiv weniger Eingabe, wenn Sie die Abfrage von Hand schreiben.

2

wäre Ein andere Möglichkeit, XML zu verwenden, um alle Spalten zu bekommen, um ein einzelnes Feld ... wie diese zu drucken:

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

eine Weile dauern könnte laufen, wenn es ein besonders großer Tisch ist, aber Es sollte Sie zwingen, herauszufinden, ob diese Zeichenfolge in einer bestimmten Tabelle existiert.

+0

Wofür sind die eckigen Klammern? Dies ist MySQL, nicht SQL-Server. – Barmar

+0

Danke Barmar ... guter Fang :-) – processoriented

+0

'FOR XML RAW' ist ein Microsoft SQL Server-ism, nicht von MySQL unterstützt. –

0

Sie können dynamisches 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'); 
Verwandte Themen