具有高级条件的mysql,按相关性排序

u7up0aaq  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(436)

我有一个sql查询的搜索功能,有点复杂,但它的工作非常好。

SELECT
    SQL_CALC_FOUND_ROWS p.id as id,
    p.title as title,
    co.title as company,
    p.price as price,
    p.image_url as image_url FROM products p 
JOIN product_categories pc ON p.id = pc.product_id
JOIN categories cat ON pc.category_id = cat.id
JOIN companies co ON p.company_id = co.id

        WHERE MATCH(p.title) AGAINST("nalle" IN BOOLEAN MODE)
        OR MATCH(p.description) AGAINST("nalle" IN BOOLEAN MODE)
        OR MATCH(cat.title) AGAINST("nalle" IN BOOLEAN MODE)
        OR MATCH(co.title) AGAINST("nalle" IN BOOLEAN MODE)

    GROUP BY p.id
    ORDER BY p.title
    LIMIT :offset, :limit

现在它是按产品名称排序的,但它应该将最相关的结果放在第一位。意思是如果两者都匹配 p.title 以及 p.description 它比只匹配更相关 p.title . 最好的搭配是四个都搭配。
由于查询的复杂性,我不知道如何计算它。
我想这是我需要的 SELECT ??? as points ... ORDER BY points .

iq0todco

iq0todco1#

如果是innodb,也许你可以试试这个,我不确定myisam:

SELECT
    SQL_CALC_FOUND_ROWS p.id as id,
    p.title as title,
    co.title as company,
    p.price as price,
    p.image_url as image_url,
    MATCH(p.title, p.description, cat.title, co.title)
         AGAINST("nalle" IN BOOLEAN MODE) as Relevance
FROM products p 
JOIN product_categories pc ON p.id = pc.product_id
JOIN categories cat ON pc.category_id = cat.id
JOIN companies co ON p.company_id = co.id

WHERE MATCH(p.title, p.description, cat.title, co.title) AGAINST("nalle" IN BOOLEAN MODE)

GROUP BY p.id
ORDER BY Relevance DESC, p.title
LIMIT :offset, :limit

在这里的例子中,你可以看到他们是如何计算分数的。如果你要找的词在更多的领域里找到,分数会更高。

相关问题