sql >> Database >  >> RDS >> Mysql

SQL-query om een ​​door komma's gescheiden tekenreeks te vergelijken met een door komma's gescheiden tekenreeks?

Het is niet praktisch om een ​​waarde in een door komma's gescheiden tekenreeks te vergelijken met een waarde in een andere door komma's gescheiden tekenreeks in één predikaat.

U kunt FIND_IN_SET() om naar één waarde tegelijk te zoeken.

Dit betekent dat je meerdere predikaten nodig hebt, één voor elke waarde die je krijgt door je invoer te splitsen $subsector_text . Dus splits uw variabele en wijs deze toe aan een reeks FIND_IN_SET()-aanroepen.

Ik heb de volgende code niet getest, maar het zou je een idee moeten geven van waar ik het over heb:

$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)
...";

Dit zal natuurlijk een tabelscan forceren omdat er geen manier is om FIND_IN_SET() te indexeren, of een andere bewerking die naar substrings zoekt. Nou, ik veronderstel dat je voorwaarden op a.state en a.sector zal een index gebruiken om de zoekopdracht te verfijnen voordat de FIND_IN_SET() voorwaarden worden toegepast.

Ik begrijp het dilemma van het moeten werken met een systeem dat je hebt geërfd. Laat uw manager weten dat dit op een gegeven moment moet worden herzien, omdat het nooit efficiënt of betrouwbaar zal zijn zoals het nu is ontworpen.



  1. SQL (MySQL) versus NoSQL (CouchDB)

  2. Alle tabelnamen in php weergeven vanuit de MySQL-database

  3. Oracle TNS - kan geen verbinding maken via ODBC-beheerder

  4. Hoe vraag ik tussen twee datums met MySQL?