mysql多列搜索

时间:2009-02-10 09:24:24

标签: php mysql

我有一张这样的桌子:

+-------------------+---------------+
| 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行和第1行。 8.如果我输入“黑色”,它将返回第1,3,5和1行。 8.连衣裙应该返回第1,8和8行。 9.

任何人都可以想到一个非常优雅,漂亮的sql,它会占用任意数量的搜索词并返回最简洁的结果集。我可以想到一些非常丑陋的方法来做到这一点,但它们会扰乱我的业力。

6 个答案:

答案 0 :(得分:3)

我能想到的唯一 nice 解决方案(业力方面)将涉及使用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');

答案 1 :(得分:1)

where colour+description like '%s1%'

答案 2 :(得分:0)

理想情况下,我认为你会有两个单独的搜索词,一个用于描述(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有点生疏,所以我不知道你是怎么做的,但概念是合理的。

答案 3 :(得分:0)

您的列的数据类型是什么?如果它们是VARCHAR或类似的,你只需要

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

(这是改编自@Pax,我认为他误解了这个问题 - 我认为它应该在搜索词出现在'description'或'color'时匹配。)

答案 4 :(得分:0)

好吧,只要您可以使用PHP来汇编查询,这应该可行:

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

...在搜索词中为每个单词添加其中一个括号条件,并用“AND”连接它们。这需要在搜索词中的每个词的至少一列中匹配。

它不是纯SQL(实际查询将取决于搜索词中有多少单词),但它感觉合理优雅,我认为它应该可以完成这项工作。

答案 5 :(得分:0)

$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%')";
}