0

別の行データに従って行を取得するにはどうすればよいですか。例: その他に従って広告を取得したい。

どのように比較が行われるかは知っていますし、現在アクティブな広告のスコアを取得する方法も知っていますが、広告を取得する方法はわかりません。

私の現在のクエリは次のとおりです。ただし、最も類似した 10 個の広告ではなく、同じ行の 10 倍が返されます。

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
4

2 に答える 2

1

MySQL の全文検索機能を確認する必要があります。適切な部分文字列を検索する代わりに、データベース内の同様のテキスト コンテンツを検索できます(のようにLIKE)。その場合、類似性の「スコア」を手動で計算する必要はありません。

ウェブ上にはたくさんの例があります。

似たようなニュースがなくても、少なくともX件のニュース ( X件のニュースが存在する場合)を常に取得したい場合は、次のようにします。

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

Xが 10 で、ニュース タイトルが関連ニュースを探しているニュースのタイトルで、全文インデックスがTitle,列にあるDescriptionと仮定しContentます。

于 2013-11-02T22:43:21.243 に答える
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
于 2013-11-02T22:43:08.100 に答える