2017-09-24 1 views
0

Ich habe eine Variable, die eine durch Komma getrennte Liste enthalten kann. In meiner Datenbank habe ich auch eine Spalte mit einer durch Spalten getrennten Liste.Finden Sie mehrere Nadeln in FIND_IN_SET

Ich weiß, dass ich durch die Verwendung FIND_IN_SET(needle, haystack)

jedoch einen einzelnen Wert in dieser db Spalte finden, wenn mein Variable eine Liste wie „a, b, c“ enthält, wie kann ich überprüfen, ob mindestens ein Element in Die Liste entspricht mindestens einem Element in der Spalte? Ist das möglich?

+0

Sie müssen FIND_IN_SET für jeden einzelnen Eintrag in der Variable verwenden, eine ODER auf die Kontrollen der Anwendung .... aber das ist wirklich schlecht Datenbank-Design, und Sie sollten Ihre Tabellen normalisieren, wenn überhaupt möglich, die Art der Abfrage zu machen leichter –

+0

* „ich habe eine Variable, die eine durch Kommata getrennte Liste enthält.“ * - Dieser Teil wird zu mir, ist unklar. Ihre Frage steht zu breit in Bezug auf diese zu sein. Wird es oder wird es nicht? –

Antwort

1

Es klingt als ob Sie wahrscheinlich einige Verknüpfungstabellen in Ihrer Datenbank benötigen. Wenn Sie kommagetrennte Listen in Spalten speichern, um sie mit anderen kommagetrennten Listen zu vergleichen, wird Ihre Leistung beeinträchtigt, wenn Sie irgendeine Art von Skalierung erreichen.

ich sehr empfehlen würde Sie mehr über die Verknüpfung Tabellen (assoziative Einheiten), um vielleicht überzeugen Sie lesen etwas Ihre Datenbank-Design zu ändern: https://en.wikipedia.org/wiki/Associative_entity

Ihre Frage zu beantworten, wie Sie FIND_IN_SET verwenden würden mehrere Suchen durchführen In einer einzelnen Abfrage müssten Sie Ihre Abfrage dynamisch erstellen.

Hier ist ein einfaches Beispiel, um Ihnen einfach zu zeigen, wie Sie eine Abfrage dynamisch erstellen. Führen Sie die erforderlichen Schritte aus, um die SQL-Injektion zu verhindern (http://php.net/manual/en/security.database.sql-injection.php).

// This is the list you want to search against - for your actual implementation you would use your column name 
$haystack_str = '2,4,6,8,10'; 

// This is the comma separated list you want to use as your needle 
$search_str = '1,2,3'; 

// Break the string apart into separate values 
$search_array = explode(',', $search_str); 

// Store your query fragments 
$query_array = array(); 

// Loop through each string value you want to use as your needle 
foreach ($search_array as $needle) { 
    // PLEASE TAKE PRECAUTIONS AGAINST SQL INJECTION !!! 
    $query_array[] = sprintf('FIND_IN_SET("%s","%s")', $needle, $haystack_str); 
} 

// Join all pieces together using OR 
$query_str = implode(' OR ', $query_array); 

// Show your example query 
echo 'SELECT ' . $query_str . ';'; 

Beispiel: https://eval.in/867963

Dies ergibt die folgende Abfrage: SELECT FIND_IN_SET("1","2,4,6,8,10") OR FIND_IN_SET("2","2,4,6,8,10") OR FIND_IN_SET("3","2,4,6,8,10");

Gibt einen Wert im Bereich von 1 bis N, wenn die String str in der Stringliste strlist ist, die aus von N Teilsträngen. Gibt 0 zurück, wenn str nicht in strlist oder wenn strlist ist die leere Zeichenkette. https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set

Die Beispielabfrage wird 1 erzeugen, die eine Ihrer Suchwerte angibt, ist in Ihrem Set.

Verwandte Themen