我的数据库中有一个包含逗号分隔值的字段,这些值是数字,我正在尝试执行搜索并计算数字在该列中出现的次数该列,MySQL搜索VARCHAR字段中的数字
$sql = "SELECT sector_id_csv, COUNT(sector_id_csv) as count FROM cv WHERE sector_id_csv LIKE '$sectorId'";
这似乎很慢,并且不会返回任何结果,并且我知道它在表中搜索的sector_id。
我的数据库中有一个包含逗号分隔值的字段,这些值是数字,我正在尝试执行搜索并计算数字在该列中出现的次数该列,MySQL搜索VARCHAR字段中的数字
$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%'";
什么容易造成这种情况的问题,虽然是事实,50
搜索也会找到501
502
503
等上。
如果你可以依靠你的逗号分隔的列表有一个结尾逗号后面每项,这将是更可靠的搜索
50,
只赶上价值。
这将导致FULL TABLE SCAN执行。在大桌上,这将非常慢。 – 2010-04-09 11:43:13
@FractalizeR yup。无论如何,我认为这种方法会很慢,规范化桌面肯定会加快速度。但是也许速度够快 - 对于较小的项目,数据更容易处理。 – 2010-04-09 11:53:53
感谢您的答案给了足够的基础让它工作,桌子永远不会很大。 – 2010-04-09 14:04:30
您是否需要使用%
通配符来填充LIKE的值?
$sql = "SELECT sector_id_csv, COUNT(sector_id_csv) as count FROM cv WHERE sector_id_csv LIKE '%".$sectorId."%'";
至少这是我通过阅读本文的理解,您对通配符的使用将取决于您所需的条件。
其实这个数字可能在他开始或结束时。所以,你需要做的
WHERE sector_id_csv='$sectorId' OR sector_id_csv LIKE '%,$sectorId' OR sector_id_csv LIKE '$sectorId,%' OR sector_id_csv LIKE '%,$sectorId,%'
...但如果你scema被归你就不需要通过这些跳铁圈 - 它会运行很多更快。
C.
SELECT count(*) from TABLENAME where FIND_IN_SET('VALUE',FILDNAME)>0;
其他u可以使用INSTR,正则表达式.... 这是最好有FILDNAME索引。
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'有什么值? – 2010-04-09 10:46:58