我的数据库中有一个字段,其中包含逗号分隔值,这些值是数字,我正在尝试搜索并计算整个列中该列中出现数字的次数,
$sql = "SELECT sector_id_csv, COUNT(sector_id_csv) as count FROM cv WHERE sector_id_csv LIKE '$sectorId'";
这看起来很慢,并且不会返回任何结果,我知道它存在于表中的sector_id。
答案 0 :(得分:2)
基本上,如果你使用%
通配符,这应该可以正常工作:
WHERE sector_id_csv LIKE '%$sectorId%'";
在这种情况下往往会导致问题的是,50
的搜索也会找到501
502
503
等等。
如果您可以依赖逗号分隔列表在每个条目后面有一个尾随逗号,那么搜索
会更可靠 50,
仅捕获该值。
答案 1 :(得分:2)
WHERE CONCAT(',', sector_id_csv, ',') LIKE '%,$sectorId,%'
或
WHERE FIND_IN_SET('$sectorId', sector_id_csv);
这将确保您的查询仅返回给定字段中具有扇区ID的行。如果此字段中的扇区id-s以逗号分隔。
使用LIKE或FIND_IN_SET的任何查询都会很慢,因为它无法利用索引。请考虑将所有扇区id-s放在单独的表中。
另外出于安全考虑,请记住确保$ sectorId是一个数字,方法是将它转换为int:
$sectorId = (int)$sectorId;
在查询中使用它之前。
答案 2 :(得分:1)
您是否需要使用%
通配符填充值以使LIKE正常工作?
$sql = "SELECT sector_id_csv, COUNT(sector_id_csv) as count FROM cv WHERE sector_id_csv LIKE '%".$sectorId."%'";
至少这是我在阅读本文时的理解,您对通配符的使用将取决于您所希望的条件。
答案 3 :(得分:1)
...但是如果你的架构规范化了,你就不需要跳过这些箍 - 它会更快地运行很多。
下进行。
答案 4 :(得分:0)
实际上这个数字也可能是他的开头或结尾。所以你需要做
WHERE sector_id_csv='$sectorId' OR sector_id_csv LIKE '%,$sectorId' OR sector_id_csv LIKE '$sectorId,%' OR sector_id_csv LIKE '%,$sectorId,%'
答案 5 :(得分:0)
SELECT count(*) from TABLENAME where FIND_IN_SET('VALUE',FILDNAME)>0;
其他你可以使用instr,regexp .... 建议将FILDNAME编入索引。