如何在表中的多个列上权衡MySQL搜索结果

如何在表中的多个列上权衡MySQL搜索结果,mysql,Mysql,我目前正在开发一个网站,需要搜索一个数据库表,books\u for\u sale,以匹配以下字段:isbn\u 10,isbn\u 13,name,author,publisher,description 每个字段都需要加权,以便根据相关性对结果进行排序 我想使用以下相关性乘数: `isbn` = $searchTerm (30 relevance factor) `isbn` LIKE $searchTerm% (25 relevance factor) `name` = $searchT

我目前正在开发一个网站,需要搜索一个数据库表,
books\u for\u sale
,以匹配以下字段:
isbn\u 10
isbn\u 13
name
author
publisher
description

每个字段都需要加权,以便根据相关性对结果进行排序

我想使用以下相关性乘数:

`isbn` = $searchTerm (30 relevance factor)
`isbn` LIKE $searchTerm% (25 relevance factor)

`name` = $searchTerm (20 relevance factor)
`name` LIKE $searchTerm% (15 relevance factor)
`name` LIKE %$searchTerm% (10 relevance factor)

`author` LIKE $searchTerm (22 relevance factor)
`author` LIKE $searchTerm% (14 relevance factor)
`author` LIKE %$searchTerm% (1 relevance factor)

`description` LIKE %$searchTerm% (2 relevance factor)
`publisher` LIKE %$searchTerm% (1 relevance factor)
当前表SQL:

--
-- Table structure for table `books_for_sale`
--

CREATE TABLE IF NOT EXISTS `books_for_sale` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `seller_id` int(11) NOT NULL,
  `isbn_10` varchar(10) NOT NULL,
  `isbn_13` varchar(13) NOT NULL,
  `name` int(11) NOT NULL,
  `price` int(11) NOT NULL,
  `image_id` int(11) NOT NULL,
  `condition_id` int(11) NOT NULL,
  `author` varchar(50) NOT NULL,
  `publisher` varchar(50) NOT NULL,
  `description` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `isbn_10` (`isbn_10`),
  KEY `isbn_13` (`isbn_13`),
  KEY `name` (`name`),
  KEY `author` (`author`),
  KEY `seller_id` (`seller_id`),
  KEY `publisher` (`publisher`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
我曾尝试在谷歌上搜索不同的功能,但没有找到任何有用的东西。如果有人能帮我的话,我会非常感激,因为我还不熟悉更高级的MySQL功能


另外,如果我需要重组我的表以更好地支持这种类型的搜索功能,请告诉我。

这是一种有效的语法:

SELECT * FROM books_for_sale

ORDER BY   30 * (`isbn_10` = '$searchTerm')
         + 30 * (`isbn_13` = '$searchTerm')
         + 25 * (`isbn_10` LIKE '$searchTerm%')
         + 25 * (`isbn_13` LIKE '$searchTerm%')
         + 20 * (`name` = '$searchTerm')
         + ...
小提琴:

请注意,这只是一个表达式,因此也将执行:

SELECT books_for_sale.* ,
(
    30 * (`isbn_10` = '$searchTerm')
  + 30 * (`isbn_13` = '$searchTerm')
  + 25 * (`isbn_10` LIKE '$searchTerm%')
  + 25 * (`isbn_13` LIKE '$searchTerm%')
  + 20 * (`name` = '$searchTerm')
  + ...
) as `relevance`

HAVING `relevance` > 10
ORDER BY `relevance` DESC

可以在WHERE中执行所有这些操作吗?这样我就可以将相关性值存储为
rel
,只需执行OrderBy
rel
或快速将其更改为OrderBy
author
或其他字段中的一个?@Steven10172这是一个普通表达式。只要您考虑别名可见性的规则,您就很好:我看不到在where子句中定义别名的方法。感谢您帮助我了解一般语法。我现在应该能够完成这项功能了。我现在应该*(是一个打字错误)@jandvorak