2010-04-09 110 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; 

在查詢中使用它。