私はまだあなたが何を望んでいるのか完全には理解していませんでした。
さて、これが私たちが議論する最初のバージョンです。
次のようにビューを作成することをお勧めします。
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文字列関数を使用してクエリを正規化することができます; 1つの方法は、出現するすべての'、'を'|'に置き換え、余分なスペースを削除して、次のクエリを実行することです。[@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など)で実行することをお勧めします。