高级MySQL搜索帮助

时间:2010-06-11 19:53:12

标签: php mysql

我一直想尝试一段时间但现在无济于事。我的MySQL知识充其量只是基本的,所以我可以使用一些指导我应该用于以下内容:

我需要搜索2个表(“圣经”和“书籍”)。现在我只是用以下查询搜索“圣经”:

SELECT * 
  FROM bible 
 WHERE text LIKE '%" . $query . "%' 
 ORDER BY likes DESC 
    LIMIT $start, 10

现在,我需要添加另一个搜索一些非常先进的东西的部分。这是我想要做的伪代码,我知道它不起作用:

SELECT * 
  FROM bible 
 WHERE books.book+' '+bible.chapter+':'+bible.verse = '$query'

$ query等于Genesis 1:2,Genesis来自books.book,1来自bible.chapter,2来自bible.verse

非常感谢任何关于此的帮助/指导=)

4 个答案:

答案 0 :(得分:3)

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

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

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

以下是我使用PDO在PHP中运行查询的方法:

$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不支持。

答案 1 :(得分:0)

您需要首先将查询解析为书籍,章节和PHP中的诗句。

正则表达式应该有效:

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!

答案 2 :(得分:0)

你很亲密。要连接字段,请使用CONCAT()函数:

SELECT * FROM bible WHERE CONCAT(books.book, ' ', bible.chapter, ':', bible.verse) = '$query'

答案 3 :(得分:0)

您可以使用MySQL concatenation

SELECT * 
FROM bible JOIN books
WHERE CONCAT(books.book, ' ', bible.chapter, ':', bible.verse) = '$query'

我不确定您的外键是将书籍与圣经相关联,但也可能需要说明。