MySQL在VARCHAR字段中搜索一个数字

时间:2010-04-09 10:45:17

标签: php mysql

我的数据库中有一个字段,其中包含逗号分隔值,这些值是数字,我正在尝试搜索并计算整个列中该列中出现数字的次数,

$sql = "SELECT sector_id_csv, COUNT(sector_id_csv) as count FROM cv WHERE sector_id_csv LIKE '$sectorId'";

这看起来很慢,并且不会返回任何结果,我知道它存在于表中的sector_id。

6 个答案:

答案 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编入索引。