簡體   English   中英

mysql多列搜索

[英]mysql multi-column search

我有這樣一張桌子:


+-------------------+---------------+
| description       | colour        |
+-------------------+---------------+
| Macrame Dress     | Washed Black  |
| Darcelle Gilet    | Dirty Shellac |
| Darcelle Cardigan | Washed Black  |
| Let It Rot Vest   | Optic White   |
| Let It Rot Crew   | Washed Black  |
| Let It Rot Crew   | Optic White   |
| Battalion Short   | Somme         |
| Seine Dress       | Washed Black  |
| Seine Dress       | Cocomotion    |
| Odette V-neck     | Linen Marl    |
+-------------------+---------------+
我想搜索它為“黑色連衣裙”,它只返回第1行和第8行。如果我輸入“黑色”,它將返回第1,3,5和8行。連衣裙應該返回第1,8和9行。

任何人都可以想到一個非常優雅,漂亮的sql,它將采用任意數量的搜索詞並返回最簡潔的結果集。 我可以想到一些非常丑陋的方法來做這件事,但是他們打亂了我的業力。

我能想到的唯一不錯的解決方案(karma-wise)將涉及使用FULLTEXT索引。 這將允許您使用這樣的查詢:

SELECT * FROM mytable
WHERE MATCH (description,color) AGAINST ('black dress');

不幸的是,如果我沒記錯的話,FULLTEXT索引需要MyISAM表類型。

編輯

我懷疑這是你正在尋找的,但讓我為了討論添加它。 可以將數據復制到臨時MyISAM表中,然后對其進行全文搜索:

CREATE TEMPORARY TABLE mytmptable ENGINE=MyIsam SELECT * FROM mytable;
ALTER TABLE mytmptable ADD FULLTEXT KEY (description,color); 
SELECT * FROM mytmptable WHERE MATCH (description,color) AGAINST ('black dress');
where colour+description like '%s1%'

好吧,只要你可以使用PHP來組裝查詢,這應該工作:

SELECT * FROM tbl
WHERE (description LIKE '%black%' OR colour LIKE '%black%')
AND (description LIKE '%dress%' OR colour LIKE '%dress%')

...在搜索詞中為每個單詞添加其中一個括號條件,並用“AND”連接它們。 這需要在搜索項中的每個單詞的至少一列中匹配。

它不是純SQL(實際查詢將取決於搜索詞中有多少單詞),但它感覺相當優雅,我認為它應該完成這項工作。

$node=explode(" ",$keysearch);
$sql="SELECT * FROM tbl_dress WHERE ";
$x=0;
foreach ($node as $key => $ns) {
    $x++;
    if ($x > 1){$sql.=" AND ";}
    $sql.="(CONCAT(description, colour) LIKE '%$ns%')";
}

理想情況下,我認為你會有兩個單獨的搜索詞,一個用於描述(s1),一個用於顏色(s2)。

然后您的查詢變為:

select * from tbl where description like '%(s1)%' and colour like '%(s2)%'

當然,用s1和s2代替值。

空白s2將導致%%應該匹配所有內容(我認為)。

為了能夠在任一領域中搜索多個術語,您需要類似的東西

select * from tbl
    where description + colour like '%(s1)%'
      and description + colour like '%(s2)%'
      and description + colour like '%(s3)%'

這必須根據搜索模式中的單詞數量動態構建(因此“黑色連衣裙”將具有s1和s2,黑色將具有s1)。 “description + color”位是連接字段; 我的SQL有點生疏,所以我不知道你是怎么做的,但概念是合理的。

您的列的數據類型是什么? 如果它們是VARCHAR或類似的,你就是這么做的

select 
  * 
from 
  tbl 
where 
  description like '%(s1)%' 
  or colour like '%(s1)%'

(這是改編自@Pax,我認為他誤解了這個問題 - 我認為它應該在搜索詞出現在'description'或'color'時匹配。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM