【问题标题】:mysql query LIKEmysql查询喜欢
【发布时间】:2012-12-23 05:21:15
【问题描述】:

我需要在两个表上选择任何出现的单词(关键字搜索),我所做的查询是这样的:

SELECT t1.fname, t1.lname, t2.* FROM t1 , t2  
     WHERE t2.title LIKE "%test%" 
     OR t2.desc LIKE "%test%" 
     OR t2.inc LIKE "%test%" 
     OR t1.fname LIKE "%test%" 
     OR t1.lname LIKE "%test%" 
     AND t1.c_id = t2.c_id;

由于数据库中有大量数据,这个特定的搜索(使用“test”关键字)需要几分钟,我想知道如何优化它。 我尝试使用 LEFT JOIN,但似乎我做错了 - 因为结果非常延迟,但查询执行得非常快。

是这样的:

SELECT * FROM t2 AS a 
  LEFT JOIN t1 AS b ON a.c_id = b.c_id 
    WHERE a.desc LIKE '%test%' 
     OR a.title LIKE '%test%' 
     OR a.inc LIKE '%test%' 
     OR b.fname LIKE '%test%'  
     OR b.lname LIKE '%test%';

任何帮助将不胜感激......谢谢。

【问题讨论】:

  • 您使用的是哪个数据库引擎?
  • MyIsam ... 表是以前构建的,我正在修复错误
  • 如果您有 MyISAM 表,那么您可以使用 MATCH..AGAINST 关键字在多个列中搜索字符串。检查我的答案,它将让您了解如何在查询中使用 MATCH..AGAINST
  • 是的,我想...但并非所有这些都是 MyISAM :(

标签: mysql sql select sql-like


【解决方案1】:

您的第一个语句不是您想要的:AND 子句采用 precedence 超过 OR 所以您实际上已经写了

t2.title LIKE "%test%" 
OR t2.desc LIKE "%test%" 
OR t2.inc LIKE "%test%" 
OR t1.fname LIKE "%test%" 
OR (t1.lname LIKE "%test%" AND t1.c_id = t2.c_id;)

这最终导致 (有点歪斜) natural join 在 t1 和 t2 之间返回很多行。

【讨论】:

  • 是的,一定是对的——结果不正常。我尝试了你的建议,但它是一样的。我想,左连接会更好?
  • @Angel M - 我没有提出任何建议,只是向您展示了原始声明中的错误。我不知道您的用例,但我认为您应该将 LEFT JOIN 替换为 FULL OUTER JOIN 以获得 t1 或 t2 的结果。
  • 我的意思是 - 显示错误 - 我找到了方法 - 现在我得到了正确的结果。
【解决方案2】:

尝试 MATCH..AGAINST 在多个列中搜索 MyISAM 表:

SELECT * 
FROM t2 AS a 
INNER JOIN t1 AS b ON a.c_id = b.c_id 
WHERE MATCH (a.desc, a.title, a.inc, b.fname, b.lname) AGAINST ('test') 

查看此链接MYSQL FULL TEXT SEARCH

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2012-09-18
    • 1970-01-01
    相关资源
    最近更新 更多