2010-04-09 181 views
4

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

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

这似乎很慢,并且不会返回任何结果,并且我知道它在表中搜索的sector_id。

+0

'$ sectorID'有什么值? – 2010-04-09 10:46:58

回答

2

基本上,如果你使用%通配符这个应该可以正常工作:

WHERE sector_id_csv LIKE '%$sectorId%'"; 

什么容易造成这种情况的问题,虽然是事实,50搜索也会找到501502503等上。

如果你可以依靠你的逗号分隔的列表有一个结尾逗号后面项,这将是更可靠的搜索

50,

只赶上价值。

+0

这将导致FULL TABLE SCAN执行。在大桌上,这将非常慢。 – 2010-04-09 11:43:13

+1

@FractalizeR yup。无论如何,我认为这种方法会很慢,规范化桌面肯定会加快速度。但是也许速度够快 - 对于较小的项目,数据更容易处理。 – 2010-04-09 11:53:53

+0

感谢您的答案给了足够的基础让它工作,桌子永远不会很大。 – 2010-04-09 14:04:30

1

您是否需要使用%通配符来填充LIKE的值?

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

至少这是我通过阅读本文的理解,您对通配符的使用将取决于您所需的条件。

0

其实这个数字可能在他开始或结束时。所以,你需要做的

WHERE sector_id_csv='$sectorId' OR sector_id_csv LIKE '%,$sectorId' OR sector_id_csv LIKE '$sectorId,%' OR sector_id_csv LIKE '%,$sectorId,%' 
1

...但如果你scema被归你就不需要通过这些跳铁圈 - 它会运行很多更快。

C.

0
SELECT count(*) from TABLENAME where FIND_IN_SET('VALUE',FILDNAME)>0; 

其他u可以使用INSTR,正则表达式.... 这是最好有FILDNAME索引。

2
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; 

在查询中使用它。