根据另一行获取10个最相似的行

时间:2013-11-02 22:36:13

标签: mysql

如何根据其他行数据获取行。例如。我想根据其他人获得广告。

我知道如何进行比较,我知道如何获得当前有效广告的得分,但我不知道如何获得广告。

我当前的查询如下 - 但它将返回10 x相同的行,而不是十个最相似的广告。

SELECT
    a.AdvertisementID as A_AdvertisementID,
    IF(a.Topic LIKE a2.Topic, 50, 0) + IF(a.Description LIKE a2.Description, 40, 0) + IF(a.Cate_CategoryID LIKE a2.Cate_CategoryID, 10, 0) as A_Score,
    a.AdvertisementID as A_AdvertisementID,
    a.Topic as A_Topic,
    LEFT(a.Description, 300) as A_Description,
    a.Price as A_Price,
    a.Type as A_Type
FROM
    ".DB_PREFIX."A_Advertisements a2,
    ".DB_PREFIX."A_Advertisements a
WHERE
    a2.AdvertisementID <> a.AdvertisementID
AND
    a.AdvertisementID = :a_id
ORDER BY
    A_Score DESC

2 个答案:

答案 0 :(得分:1)

您应该查看MySQL Fulltext search功能。它允许在数据库中搜索类似的文本内容,而不是搜索适当的子字符串(如LIKE那样)。您不需要手动计算相似度的“得分”。

网上有很多例子。

如果你总是想要检索至少 X 新闻(假设存在 X 新闻),即使没有相似的新闻,请试试这个:

SELECT *, MATCH(Title, Description, Content) AGAINST("News title") AS score
ORDER BY score DESC, RAND() LIMIT 0, 10

我假设 X 是10而新闻标题是正在查找相关新闻的新闻标题,并且全文索引在{{ 1}},TitleDescription列。

答案 1 :(得分:0)

那是因为你只选择了来自a的列,而在你的WHERE中你说的是a.AdvertisementID = :a_id。从a2中选择列,您会得到不同的结果。

SELECT
    a2.AdvertisementID as A_AdvertisementID,
    IF(a.Topic LIKE a2.Topic, 50, 0) + IF(a.Description LIKE a2.Description, 40, 0) +     IF(a.Cate_CategoryID LIKE a2.Cate_CategoryID, 10, 0) as A_Score,
    a2.Topic as A_Topic,
    LEFT(a2.Description, 300) as A_Description,
    a2.Price as A_Price,
    a2.Type as A_Type