Php 查询以分号分隔的值列,其中

Php 查询以分号分隔的值列,其中,php,mysql,denormalization,Php,Mysql,Denormalization,我有以下问题: SELECT a.* FROM programm a WHERE a.traffic IN ('DE;AT;CH;') ORDER BY a.programmid asc LIMIT 0,10 <pre> programmid | traffic ------------+------ 1 | DE;AT;CH; 2 | AT; 3

我有以下问题:

    SELECT a.* 
      FROM programm a 
     WHERE a.traffic IN ('DE;AT;CH;') 
     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 a 
     WHERE a.traffic IN ('DE;') 
     ORDER 
        BY a.programmid asc 
     LIMIT 0,10
数据库结构:

所有程序ID应列在DE、BG通信量中的位置。 这将是编程MID 1,4,5

变体1:

WHERE LOCATE(';DE;', CONCAT( ';', traffic, ';'))
备选案文2:

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

规范化您的数据

注:如果您需要按多个国家进行搜索,则可以使用单独的表达式按每个国家进行搜索。

解决方案不是构建黑客代码以适应糟糕的表设计,而是对数据库进行规范化,以便编写干净的代码。
WHERE FIND_IN_SET('DE', REPLACE(traffic, ';', ','))
WHERE LOCATE(';DE;', CONCAT( ';', traffic, ';'))