Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie SQL do dopasowania ciągu oddzielonego przecinkami do ciągu oddzielonego przecinkami?

Nie jest praktyczne dopasowywanie dowolnej wartości w ciągu rozdzielanym przecinkami do dowolnej wartości w innym ciągu rozdzielanym przecinkami w pojedynczym predykacie.

Możesz użyć ZNAJDŹ_W_ZESTAWIE() aby wyszukiwać jedną wartość na raz.

Oznacza to, że potrzebujesz wielu predykatów, po jednym dla każdej wartości otrzymanej przez podzielenie danych wejściowych na $subsector_text . Podziel zmienną i zmapuj ją na serię wywołań FIND_IN_SET().

Nie testowałem poniższego kodu, ale powinien dać ci wyobrażenie o czym mówię:

$subsector_array = array_map('intval', explode(',', $subsector_text));
$subsector_terms = array_map(
  function ($id) { return "FIND_IN_SET($id, a.subsector)"; },
  $subsector_array);
$subsector_expr = implode(' OR ', $subsector_terms);

$sql = "
SELECT ...
          WHERE a.state = 1 
            AND a.sector = '$sector'
            AND ($subsector_expr)
...";

To oczywiście wymusi skanowanie tabeli, ponieważ nie ma sposobu na indeksowanie FIND_IN_SET() ani żadnej innej operacji, która szuka podciągów. Cóż, przypuszczam, że twoje warunki na a.state i a.sector użyje indeksu, aby zawęzić wyszukiwanie przed zastosowaniem warunków FIND_IN_SET().

Rozumiem dylemat pracy z systemem, który odziedziczyłeś. Poinformuj swojego przełożonego, że w pewnym momencie musi to zostać zrefaktoryzowane, ponieważ nigdy nie będzie wydajne ani niezawodne w sposób, w jaki jest teraz zaprojektowane.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wydrukuj losowy wiersz z zapytania mysql

  2. ColdFusion:wiele instrukcji SQL w zapytaniu?

  3. Zakres limitu MySQL

  4. Wykryj emotikony w ciągu

  5. Nazwa schematu MySQL z myślnikiem nie pozwala mi na wykonanie zapytania wiersza poleceń