如何根据其他行数据获取行。例如。我想根据其他人获得广告。
我知道如何进行比较,我知道如何获得当前有效广告的得分,但我不知道如何获得广告。
我当前的查询如下 - 但它将返回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
答案 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}},Title
和Description
列。
答案 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