我在我的数据库中有一个包含逗号分隔值的字段,这些值是数字,我正在尝试搜索并计算该列中数字出现的次数。
$sql = "SELECT sector_id_csv, COUNT(sector_id_csv) as count FROM cv WHERE sector_id_csv LIKE '$sectorId'";
这似乎很慢,而且没有返回任何结果,我知道它要搜索的 sector_id 存在于表中。
%
通配符,这应该可以正常工作:WHERE sector_id_csv LIKE '%$sectorId%'";
WHERE CONCAT(',', sector_id_csv, ',') LIKE '%,$sectorId,%'
或者
WHERE FIND_IN_SET('$sectorId', sector_id_csv);
这将确保您的查询仅返回具有给定字段中扇区ID的行。 假设此字段中的扇区ID以逗号分隔。
使用LIKE或FIND_IN_SET的任何查询都会很慢,因为它无法利用索引。 请考虑将所有扇区ID放入单独的表中。
出于安全原因,请记住通过像这样将$sectorId转换为int来确保$sectorId是数字:
$sectorId = (int)$sectorId;
before using it in a query.
你不需要使用 %
通配符来填充值以使 LIKE 函数工作吗?
$sql = "SELECT sector_id_csv, COUNT(sector_id_csv) as count FROM cv WHERE sector_id_csv LIKE '%".$sectorId."%'";
至少从阅读这篇文章来看,你使用通配符的方式将取决于你所期望的条件。
...但如果您的模式规范化,您就不需要跳过这些障碍 - 它会运行得快得多。
C。
WHERE sector_id_csv='$sectorId' OR sector_id_csv LIKE '%,$sectorId' OR sector_id_csv LIKE '$sectorId,%' OR sector_id_csv LIKE '%,$sectorId,%'
SELECT count(*) from TABLENAME where FIND_IN_SET('VALUE',FILDNAME)>0;
其他你可以使用instr,regexp...最好将FILDNAME建立索引。
$sectorID
有什么值? - Pekka