我仍然沒有完全明白你想要什麼。那麼,這是我們討論的第一個版本。
我建議你創建一個視圖,如下所示:
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