首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高级MySQL搜索帮助

高级MySQL搜索帮助
EN

Stack Overflow用户
提问于 2010-06-12 03:53:12
回答 4查看 373关注 0票数 1

我已经试着想了一段时间了,但都没有结果。我的MySQL知识充其量是基本的,所以我可以使用一些关于我应该使用以下内容的指导:

我有两个表(“圣经”和“书籍”),我需要搜索。现在,我只是用下面的查询搜索“bible”:

代码语言:javascript
复制
SELECT * 
  FROM bible 
 WHERE text LIKE '%" . $query . "%' 
 ORDER BY likes DESC 
    LIMIT $start, 10

现在,我需要添加另一个部分来搜索一些非常高级的东西。下面是我想要在伪代码中做的事情,我知道这是不起作用的:

代码语言:javascript
复制
SELECT * 
  FROM bible 
 WHERE books.book+' '+bible.chapter+':'+bible.verse = '$query'

创世纪相当于创世纪1:2,创世纪来自books.book,1来自bible.chapter,2来自bible.verse

在这方面的任何帮助/指导都非常感谢=)

EN

回答 4

Stack Overflow用户

发布于 2010-06-12 04:04:18

我建议您在应用程序代码中设计一种方法来分解查询,以便从关键字中单独搜索书籍、章节和诗句。

这意味着您需要与诗句文本分开的书籍、章节和诗句的列。

您还应该使用FULLTEXT index,因为LIKE通配符搜索是extremely inefficient

下面是我如何使用PDO在PHP中运行查询。

代码语言:javascript
复制
$quoted_query = $pdo->quote($query);
$sql = "SELECT * FROM bible 
        WHERE book = ? AND chapter = ? AND verse = ?
          AND MATCH(text) AGAINST ({$quoted_query})"
$stmt = $pdo->prepare($sql);
$stmt->execute(array($book, $chapter, $verse));

我也希望对全文查询使用参数,但MySQL不支持。

票数 3
EN

Stack Overflow用户

发布于 2010-06-12 03:57:52

你需要首先在php中将查询解析为book、php和verse。

正则表达式应该是有效的:

代码语言:javascript
复制
preg_match("/(.+)([0-9]+):([0-9]+)/",$query,$matches);
$book    = trim(matches[1]); // use trim to remove extra spaces
$chapter = matches[2];
$verse   = matches[3];

然后,您的sql查询变成:

SELECT * FROM bible WHERE books.book = '$book' AND bible.chapter= '$chapter' AND bible.verse ='$verse' -- watch out for sql injection here! use prepared statements!

票数 0
EN

Stack Overflow用户

发布于 2010-06-12 04:00:42

你已经很接近了。要连接这些字段,请使用CONCAT()函数:

代码语言:javascript
复制
SELECT * FROM bible WHERE CONCAT(books.book, ' ', bible.chapter, ':', bible.verse) = '$query'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3025780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档