我仍然没有完全明白你想要什么。那么,这是我们讨论的第一个版本。
我建议你创建一个视图,如下所示:
CREATE OR REPLACE VIEW `search_view` AS
SELECT
i.id AS `item_id`,
i.title AS `item_title`,
c.id AS `cat_id`,
c.name AS `cat_name`,
t.id AS `tag_id`,
t.name AS `tag_name`
FROM item AS i
LEFT OUTER JOIN item_tag AS it
ON (i.id = it.itemId)
LEFT OUTER JOIN tag AS t
ON (it.tagId = t.id)
LEFT OUTER JOIN category AS c
ON (i.category = c.id)
WHERE ((t.id IS NOT NULL) OR (c.id IS NOT NULL));
然后你使用一些视图查询附近
SELECT
*,
(
IF(tag_name like ?, 2, 0)
+ IF(cat_name like ?, 4, 0)
+ IF(item_title like ?, 1, 0)
) AS `priority`
FROM search_view
GROUP BY item_id
ORDER BY SUM(priority);
在上面的代码没有测试。举报你的任何问题
[第一版]您使用PHP,不是吗?那么,你可以用PHP string functions来标准化你的查询;一种方法是用'|'替换每个',',删除多余的空格并执行以下查询:[我将给出一个使用@VAR的例子(实际上你会用你的输入字符串替换它)]
SET @VAR = 'notebook|samsung';
SELECT
*,
(
IF (tag_name REGEXP CONCAT('.*(', @VAR, ').*'), 2, 0)
+ IF (cat_name REGEXP CONCAT('.*(', @VAR, ').*'), 4, 0)
+ IF (item_title REGEXP CONCAT('.*(', @VAR, ').*'), 1, 0)
) AS `priority`
FROM search_view
ORDER BY priority DESC;
这次我测试过了。是的,你可以使用MySQL函数,约REPLACE(REPLACE(@VAR,' ',''), ',', '|')
。但我建议你用PHP(或者Java,Python等)来做。
我还没有真正与意见。上述部分是需要在每个查询之前运行还是仅在创建连接时运行一次? – Helto 2013-03-23 22:14:55
我真的很喜欢你的解决方案,并且你添加了对标题的搜索并给予不同领域的权重。如果您有机会,您是否愿意解释我可以如何修改这个以适应多种搜索条件?它们将以逗号分隔的字符串形式出现。 – Helto 2013-03-24 22:40:04
@你好,你创建视图一次,然后你从他们的查询,就好像他们是普通表(!)。如果您需要更新您的视图,请运行: 'CREATE OR REPLACE VIEW AS '。 关于你的最后一个疑问,我会尽力帮助你(今天如果可能的话),当我有时间(让我们看看如果我能) –
2013-03-26 18:50:47