在MySQL中搜索VARCHAR字段中的数字

4

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

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

这似乎很慢,而且没有返回任何结果,我知道它要搜索的 sector_id 存在于表中。

$sectorID 有什么值? - Pekka
6个回答

2
基本上,如果您使用%通配符,这应该可以正常工作:
WHERE sector_id_csv LIKE '%$sectorId%'";

在这种情况下,容易出现问题的原因在于搜索“50”也会找到“501”、“502”、“503”等。如果您可以确信逗号分隔的列表在每个条目后面都有一个尾随逗号,则更可靠的做法是搜索“50,”以仅捕获该值。

这会导致执行完全表扫描。对于大型表,这将非常慢。 - Vladislav Rastrusny
1
@FractalizeR 是的。我认为无论如何这种方法都会很慢,规范化表格肯定会加快速度。但也许对于较小的项目来说,这已经足够快了,用这种方式处理数据更容易。 - Pekka
感谢您的回答,为让它能正常工作提供了足够的基础,这张表不会很庞大。 - sea_1987

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是数字:

$sectorId = (int)$sectorId;

before using it in a query.


1

你不需要使用 % 通配符来填充值以使 LIKE 函数工作吗?

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

至少从阅读这篇文章来看,你使用通配符的方式将取决于你所期望的条件。


1

...但如果您的模式规范化,您就不需要跳过这些障碍 - 它会运行得快得多

C。


0
实际上数字也可能在开头或结尾。因此你需要做
WHERE sector_id_csv='$sectorId' OR sector_id_csv LIKE '%,$sectorId' OR sector_id_csv LIKE '$sectorId,%' OR sector_id_csv LIKE '%,$sectorId,%'

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

其他你可以使用instr,regexp...最好将FILDNAME建立索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接