【问题标题】:Query a semicolon-separated values column with WHERE IN [duplicate]使用 WHERE IN [重复] 查询以分号分隔的值列
【发布时间】:2021-03-03 19:58:12
【问题描述】:

我有以下问题:

    SELECT a.* 
      FROM programm a 
     WHERE a.traffic IN ('DE;AT;CH;') 
     ORDER 
        BY a.programmid asc 
     LIMIT 0,10    

效果很好。

但如果我只想查询一个国家,那是不可能的:

    SELECT a.* 
      FROM programm a 
     WHERE a.traffic IN ('DE;') 
     ORDER 
        BY a.programmid asc 
     LIMIT 0,10

数据库结构:

<pre>
 programmid | traffic
------------+------
  1         | DE;AT;CH;
  2         | AT;
  3         | CH;
  4         | PL;BG;DE;  
  5         | AM;BG;DE;
</pre>

当我查询数据库时,

    SELECT a.* FROM `programm` as a WHERE a.traffic IN ('DE;,BG;') ORDER BY a.programmid asc LIMIT 0,10    

所有程序 ID 都应列在 DE、BG 处于流量中的位置。 那将是programmid 1,4,5

【问题讨论】:

标签: php mysql denormalization


【解决方案1】:

变体 1:

WHERE FIND_IN_SET('DE', REPLACE(traffic, ';', ','))

变体 2:

WHERE LOCATE(';DE;', CONCAT( ';', traffic, ';'))

还有更多变体。但是它们都不能使用索引并导致全表扫描。

规范化您的数据。

PS。如果您需要按很多国家/地区进行搜索,请使用单独的表达式按每个国家/地区进行搜索。

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2023-02-03
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多