我有一個“list_table”表,如下所示:
id : list
1 : 1,2,44,5
2 : 4,3,5,2,56,66
是否可以檢查 '44' 是否在 mysql 資料庫的串列列中?我正在使用 codeigniter,我的代碼如下所示:
$this->db->select('*');
$this->db->from("list_table");
$this->db->where("find_in_set('44', 'list')");
$query = $this->db->get();
return $query->result();
我也嘗試過 WHERE_IN 但沒有得到正確的結果。
這是我啟用組態檔時得到的查詢:
SELECT *
FROM `poslovi`
LEFT JOIN `firme` ON `firme`.`f_id` = `poslovi`.`po_firma_id`
LEFT JOIN `kategorije` ON `kategorije`.`k_id` = `poslovi`.`po_category`
WHERE `po_date_istek` > '2022-03-21 10:37:25'
AND (`po_naziv_oglasa` LIKE '%Radnik u ?evabd?inici%' ESCAPE '!' OR `f_name`
LIKE '%Radnik u ?evabd?inici%' ESCAPE '!')
AND find_in_set("61", po_category) <> 0
AND `po_status` = '1'
ORDER BY `po_date_istek` DESC
LIMIT 10
這是我的資料庫中的內容:

順便提一下,如果我洗掉 'find_in_set' 我會得到正確的結果,所以查詢的其余部分很好,正如我注意到的那樣
uj5u.com熱心網友回復:
在 WHERE 子句中需要一個真或假條件,所以比較
$this->db->select('*');
$this->db->from("list_table");
$this->db->where("find_in_set('44', 'list') <> 0");
$query = $this->db->get();
return $query->result();
但不推薦以這種方式存盤資料。閱讀 mor in在資料庫列中存盤分隔串列真的那么糟糕嗎?
uj5u.com熱心網友回復:
在您發布的資料螢屏截圖中,可以看到您在每個逗號后包含一個空格。
的值po_categoryis 2, 7, 61, not 2,7,61—find_in_set并且不會忽略這些空格!
您已經注意到find_in_set在搜索第一個條目時有效,這是因為它沒有前導空格; 7做 61。
find_in_set(" 61", po_category)在這種情況下會匹配,但如果它是第一個條目,它將不匹配。雖然您可以(find_in_set("61", po_category) <> 0 || find_in_set(" 61", po_category)) <> 0支持這兩種情況,但這會不必要地緩慢和繁重。只需保存沒有空格的資料。或者,更好的是,不是逗號分隔的串列。
在nbk 的回答中,有一個鏈接解釋了為什么這樣做不是最佳的。保存 ID 串列的一種方法是為它們創建一個單獨的表并使用 JOIN。這對性能會更好。如果您使用的是 MySQL 8.0.17 或更高版本,另一個實作稍微復雜的選項是將其保存為 JSON 陣列并索引該陣列。
uj5u.com熱心網友回復:
正如 nbk 所說,您需要真/假條件,但是,答案不適用于 OP。您需要洗掉該答案中的單引號list:
$this->db->where("find_in_set('44', 'list') <> 0");
重寫代碼如下,減去周圍的引號list:
$this->db->select('*');
$this->db->from("list_table");
$this->db->where("find_in_set('44', list) <> 0");
$query = $this->db->get();
return $query->result();
那應該可以為您解決問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/445961.html
