最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在MySQL字段中使用逗號(hào)分隔符的方法分享

 更新時(shí)間:2012年06月17日 19:59:54   作者:  
大多數(shù)開(kāi)發(fā)者應(yīng)該都遇到過(guò)在mysql字段中存儲(chǔ)逗號(hào)分割字符串的經(jīng)歷,無(wú)論這些被分割的字段代表的是id還是tag,這個(gè)字段都應(yīng)該具有如下幾個(gè)共性

被分割的字段一定是有限而且數(shù)量較少的,我們不可能在一個(gè)字符串中存儲(chǔ)無(wú)限多個(gè)字符
這個(gè)字段所屬的表與這個(gè)字段關(guān)聯(lián)的表,一定是一對(duì)多的關(guān)系
比如下面這個(gè)表結(jié)構(gòu)所代表的content與tag這兩個(gè)對(duì)象

復(fù)制代碼 代碼如下:

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)

這些原則問(wèn)題,相信大家在開(kāi)發(fā)過(guò)程中已經(jīng)很熟悉了。但是你在使用這種方法來(lái)處理實(shí)際問(wèn)題時(shí),內(nèi)心一定還是有些許忐忑,因?yàn)檫@種方法或多或少看上去有點(diǎn)像野路子。在那本厚厚的《數(shù)據(jù)庫(kù)》教材中,也沒(méi)有提到這種設(shè)計(jì)方法,標(biāo)準(zhǔn)的方法似乎是應(yīng)該使用一個(gè)關(guān)系映射表在這兩個(gè)表之間插一杠子,盡管這樣會(huì)使用效率低下的連接查詢(xún)。

每個(gè)開(kāi)發(fā)者都曾糾結(jié)于標(biāo)準(zhǔn)與效率,但我想我們的努力能使這種方法的使用看起來(lái)更加標(biāo)準(zhǔn)。注意,以下討論的使用方法僅限于mysql,但其它數(shù)據(jù)庫(kù)應(yīng)該可以移植。

相關(guān)性檢索
很多開(kāi)發(fā)者還在使用古老的LIKE方法來(lái)實(shí)現(xiàn)相關(guān)性檢索,比如上面那個(gè)數(shù)據(jù)庫(kù)結(jié)構(gòu)中,content表中的兩條記錄都有2這個(gè)tag,那么怎樣在我取出記錄1時(shí),把與它tag相關(guān)的記錄也顯示出來(lái)呢。其實(shí)這也是CMS需要面對(duì)的一個(gè)基本問(wèn)題,也就是相關(guān)內(nèi)容的查詢(xún)。

如果你是一個(gè)菜鳥(niǎo),你可能只會(huì)想到LIKE方法,比如先把記錄1取出來(lái),然后再把tags字段按逗號(hào)分割,最后做一個(gè)循環(huán)用LIKE檢索content表中所有tags字段中包含2的記錄,類(lèi)似這樣
復(fù)制代碼 代碼如下:

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

但這種方法實(shí)在是太慢了,查詢(xún)次數(shù)多不說(shuō),LIKE查詢(xún)本來(lái)就是一個(gè)比較慢的方法。而且你還要處理前后逗號(hào)的問(wèn)題,總之麻煩是一大堆。

所以讓我們靜下心來(lái)翻翻mysql手冊(cè),看看有沒(méi)有什么驚喜。這個(gè)時(shí)候,一個(gè)名為FIND_IN_SET的函數(shù),會(huì)閃著金光映入你的眼簾。讓我們看看這個(gè)函數(shù)的定義

復(fù)制代碼 代碼如下:

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.

哦,PERFECT! 簡(jiǎn)單說(shuō)來(lái)就是尋找一個(gè)字符串是否在另一個(gè)以逗號(hào)分割的字符串中存在的函數(shù),這簡(jiǎn)直是為我們量身定做的。那么我們的sql就變成
復(fù)制代碼 代碼如下:

SELECT * FROM content WHERE FIND_IN_SET('2', tags) AND id <> 1

在翻這些函數(shù)的過(guò)程中,你應(yīng)該已經(jīng)深深地體會(huì)到mysql的設(shè)計(jì)者對(duì)以逗號(hào)分割存儲(chǔ)字段方法的肯定,因?yàn)橛泻芏喾椒ň褪窃O(shè)計(jì)用來(lái)處理這種問(wèn)題的。

這樣看起來(lái)好多了,一切似乎完美了,是這樣嗎?其實(shí)還沒(méi)有,如果你的tag比較多,你需要?jiǎng)?chuàng)建多個(gè)sql語(yǔ)句,而且有的記錄關(guān)聯(lián)的tag比較多,有的比較少,怎么能按照相關(guān)性進(jìn)行排列呢。

這個(gè)時(shí)候,你可以關(guān)注mysql的全文檢索功能。這個(gè)詞你肯定看見(jiàn)過(guò)無(wú)數(shù)回了,但是這么使用的肯定很少,讓我們直接看語(yǔ)句吧
復(fù)制代碼 代碼如下:

SELECT * FROM content WHERE MATCH(tags) AGAINST('1,2') AND id <> 1

這 個(gè)語(yǔ)句的優(yōu)勢(shì)是顯而易見(jiàn)的,你不需要對(duì)tags字段做再次分割。那么這種查詢(xún)的原理是什么呢,稍微了解下MATCH AGAINST的用法就知道,全文檢索的默認(rèn)分隔符是標(biāo)點(diǎn)符號(hào)和stopwords,其中前者正是我們需要的特性。全文檢索按照逗號(hào)將MATCH和 AGAINST里的字符串做分割,然后將它們匹配。

需要注意的是上面sql僅僅是個(gè)例子,如果你直接這么執(zhí)行,是無(wú)法得到任何結(jié)果的。原因在以下

  1. 你需要對(duì)tags字段建立fulltext索引(如果僅僅是測(cè)試,可以不做,建索引只是提高性能,對(duì)結(jié)果沒(méi)有影響)
  2. 每個(gè)被標(biāo)點(diǎn)符號(hào)分割的word長(zhǎng)度必須在3個(gè)字符以上,這才是關(guān)鍵,我們的tag id太短了,會(huì)被自動(dòng)忽略掉,這個(gè)時(shí)候你可以考慮讓id從一個(gè)比較大值開(kāi)始自增,比如1000,這樣它就夠長(zhǎng)了。
  3. 你撞到了stopwords,比如你的tags字段是這樣的'hello,nobody',nobody是mysql的一個(gè)默認(rèn)的stop words,它會(huì)被自動(dòng)忽略。stop words是英文中的一些無(wú)意義詞,搜索的時(shí)候不需要它們,類(lèi)似漢語(yǔ)中的助詞等等。但在我們的使用中顯然不是用來(lái)做搜索的,因此可以在my.cnf文件 里,加上ft_stopword_file=''來(lái)禁用它

隨著WEB技術(shù)的發(fā)展,相關(guān)搜索走SQL的情況越來(lái)越少,很多時(shí)候只需要用搜索引擎就可以了。但本文的目的并不只是討論這種方法,而是體現(xiàn)實(shí)現(xiàn)這一結(jié)果的過(guò)程。

相關(guān)文章

  • MySQL變量原理及應(yīng)用實(shí)例

    MySQL變量原理及應(yīng)用實(shí)例

    這篇文章主要介紹了MySQL變量原理及應(yīng)用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • ERROR CODE: 1175 YOU ARE USING SAFE UPDATE MODE AN

    ERROR CODE: 1175 YOU ARE USING SAFE UPDATE MODE AN

    這篇文章主要介紹了ERROR CODE: 1175 YOU ARE USING SAFE UPDATE MODE AN,本文是在MySQL Workbench的環(huán)境操作,需要的朋友可以參考下
    2014-11-11
  • MySQL進(jìn)階之索引

    MySQL進(jìn)階之索引

    索引就是一種數(shù)據(jù)結(jié)構(gòu),這種結(jié)構(gòu)類(lèi)似,鏈表,樹(shù)等等。但是比它們要復(fù)雜的多,索引(index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(有序),本文詳細(xì)介紹了MySQL索引,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • mysql?事務(wù)解析

    mysql?事務(wù)解析

    這篇文章主要給大家分享的是mysql事務(wù)解析,事務(wù)(transaction)是業(yè)務(wù)邏輯的一個(gè)基本的單元組成,下面文章圍繞mysql事務(wù)的相關(guān)資料展開(kāi)詳細(xì)內(nèi)容,需要的朋友可以參考一下希望對(duì)大家有所幫助
    2021-11-11
  • Linux下mysql 8.0安裝教程

    Linux下mysql 8.0安裝教程

    這篇文章主要為大家詳細(xì)介紹了Linux下mysql 8.0安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • mysql中count(), group by, order by使用詳解

    mysql中count(), group by, order by使用詳解

    mysql中order by 排序查詢(xún)、asc升序、desc降序,group by 分組查詢(xún)、having 只能用于group by子句、作用于組內(nèi),having條件子句可以直接跟函數(shù)表達(dá)式。使用group by 子句的查詢(xún)語(yǔ)句需要使用聚合函數(shù)。
    2017-05-05
  • 關(guān)于TIMESTAMP with implicit DEFAULT value is deprecated 錯(cuò)誤解決方法

    關(guān)于TIMESTAMP with implicit DEFAULT value&

    本文介紹了“TIMESTAMP with implicit DEFAULT value is deprecated”錯(cuò)誤的原因及解決方法,解決方法包括顯式指定默認(rèn)值、修改字段類(lèi)型、更新數(shù)據(jù)庫(kù)版本或?qū)で髱椭?感興趣的朋友一起看看吧
    2025-02-02
  • 詳解MySQL8.0原子DDL語(yǔ)法

    詳解MySQL8.0原子DDL語(yǔ)法

    這篇文章主要介紹了詳解MySQL8.0原子DDL語(yǔ)法的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-03-03
  • MySQL EXPLAIN輸出列的詳細(xì)解釋

    MySQL EXPLAIN輸出列的詳細(xì)解釋

    這篇文章主要給大家介紹了關(guān)于MySQL EXPLAIN輸出列的詳細(xì)解釋?zhuān)闹型ㄟ^(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 在Hadoop集群環(huán)境中為MySQL安裝配置Sqoop的教程

    在Hadoop集群環(huán)境中為MySQL安裝配置Sqoop的教程

    這篇文章主要介紹了在Hadoop集群環(huán)境中為MySQL安裝配置Sqoop的教程,Sqoop一般被用于數(shù)據(jù)庫(kù)軟件之間的數(shù)據(jù)遷移,需要的朋友可以參考下
    2015-12-12

最新評(píng)論

齐齐哈尔市| 天台县| 吉隆县| 酉阳| 始兴县| 手游| 聂荣县| 和林格尔县| 罗定市| 固原市| 松原市| 和林格尔县| 兴安盟| 阿合奇县| 金寨县| 夹江县| 古田县| 铜山县| 沂水县| 南平市| 枣阳市| 濮阳市| 云浮市| 定襄县| 乌拉特后旗| 普兰店市| 庄浪县| 龙山县| 嵊泗县| 桦川县| 隆德县| 淅川县| 子洲县| 上林县| 富川| 新乡县| 孟村| 嘉禾县| 台南县| 金华市| 江川县|