国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

在MySQL字段中使用逗號分隔符的方法分享

2024-07-24 12:49:12
字體:
來源:轉載
供稿:網友

被分割的字段一定是有限而且數量較少的,我們不可能在一個字符串中存儲無限多個字符
這個字段所屬的表與這個字段關聯的表,一定是一對多的關系
比如下面這個表結構所代表的content與tag這兩個對象

復制代碼 代碼如下:

mysql> SELECT * FROM content;
+----+------+| id | tags | +----+------+| 1 | 1,2 | | 2 | 2,3 | +----+------+
2 rows in set (0.01 sec)
mysql> SELECT * FROM tag;
+----+-------+| id | name | +----+-------+| 1 | php | | 2 | mysql | | 3 | java | +----+-------+
3 rows in set (0.00 sec)

這些原則問題,相信大家在開發過程中已經很熟悉了。但是你在使用這種方法來處理實際問題時,內心一定還是有些許忐忑,因為這種方法或多或少看上去有點像野路子。在那本厚厚的《數據庫》教材中,也沒有提到這種設計方法,標準的方法似乎是應該使用一個關系映射表在這兩個表之間插一杠子,盡管這樣會使用效率低下的連接查詢。

每個開發者都曾糾結于標準與效率,但我想我們的努力能使這種方法的使用看起來更加標準。注意,以下討論的使用方法僅限于mysql,但其它數據庫應該可以移植。

相關性檢索
很多開發者還在使用古老的LIKE方法來實現相關性檢索,比如上面那個數據庫結構中,content表中的兩條記錄都有2這個tag,那么怎樣在我取出記錄1時,把與它tag相關的記錄也顯示出來呢。其實這也是CMS需要面對的一個基本問題,也就是相關內容的查詢。

如果你是一個菜鳥,你可能只會想到LIKE方法,比如先把記錄1取出來,然后再把tags字段按逗號分割,最后做一個循環用LIKE檢索content表中所有tags字段中包含2的記錄,類似這樣
復制代碼 代碼如下:

SELECT * FROM content WHERE tag LIKE '%2%' AND id <> 1

但這種方法實在是太慢了,查詢次數多不說,LIKE查詢本來就是一個比較慢的方法。而且你還要處理前后逗號的問題,總之麻煩是一大堆。

所以讓我們靜下心來翻翻mysql手冊,看看有沒有什么驚喜。這個時候,一個名為FIND_IN_SET的函數,會閃著金光映入你的眼簾。讓我們看看這個函數的定義

復制代碼 代碼如下:

FIND_IN_SET(str,strlist)
Returns a value in the range of 1 to N if the string str is in the string list strlist consisting of N substrings. A string list is a string composed of substrings separated by “,” characters. If the first argument is a constant string and the second is a column of type SET, the FIND_IN_SET() function is optimized to use bit arithmetic. Returns 0 if str is not in strlist or if strlist is the empty string. Returns NULL if either argument is NULL. This function does not work properly if the first argument contains a comma (“,”) character.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 夹江县| 苏尼特左旗| 阜宁县| 齐齐哈尔市| 瓮安县| 新巴尔虎右旗| 盘锦市| 修文县| 临城县| 祁东县| 夏河县| 容城县| 昂仁县| 漳平市| 南充市| 井冈山市| 东兰县| 渑池县| 忻城县| 蒙阴县| 沁阳市| 阿勒泰市| 林周县| 玉环县| 绥江县| 无棣县| 金乡县| 濮阳市| 双桥区| 包头市| 当阳市| 乌拉特中旗| 册亨县| 明星| 抚松县| 巴林左旗| 五家渠市| 邹城市| 石屏县| 裕民县| 巴林右旗|