簡體   English   中英

PHP - MySQL搜索數據庫表返回結果與百分比匹配

[英]PHP - MySQL Search database table return result with percentage match

在我的網站上,我允許用戶選擇他們喜歡或感興趣的內容。這是使用預定義的下拉菜單完成的,因此每次用戶登錄網站時,他們都會獲得與用戶相同的用戶列表。他們。

這是通過使用MySQL WHERE子句獲取登錄用戶的興趣(存儲在db中)並與站點上的其他用戶匹配來完成的。 但我遇到的問題是如何顯示每個用戶旁邊的百分比或分數,以顯示他們與登錄用戶興趣的匹配程度。

例如:

  • user1 - 與您的興趣匹配60%
  • user1 - 與您的興趣匹配30%
  • user2 - 與您的興趣匹配20%

每個用戶有5種不同的興趣,如果所有匹配都比其100%匹配。

表結構示例:

CREATE TABLE IF NOT EXISTS `helloworld` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `like1` varchar(300) NOT NULL,
  `like2` varchar(300) NOT NULL,
  `like3` varchar(300) NOT NULL,
  `name` varchar(300) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

示例查詢:

SELECT * FROM helloworld WHERE like1='football' AND like2='art'

我在考慮使用COUNT函數,但我不確定? 或者我應該使用子查詢?

編輯:我使用PHP作為服務器端語言。 用戶不能鍵入自己的喜歡,必須使用預定義的列表。

用戶和喜歡之間有很多關系。 你的表違反了1NF - 你有一個like列的“重復組”。 相反,有一個單獨的關聯表來處理這個:

create table user_likes (
    user_id int(9) NOT NULL,
    like_name varchar(300) NOT NULL
);

現在你可以使用更簡單的查詢來獲得匹配的數量 - 我會留給你研究:)

提示:您可以使用位掩碼來幫助確定匹配,為每個不同的like_name分配預定義的2位數冪(help是一個like_names表)。

首先,我認為你需要一個不同的架構。 你擁有的那個將使你的任務非常困難,因為它不夠靈活。 我推薦這樣的東西:

CREATE TABLE `users` (
    `id`        INT NOT NULL AUTO_INCREMENT,
    `name`      VARCHAR(300) NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `likes` (
    `user`      INT NOT NULL,
    `interest`  VARCHAR NOT NULL,
    PRIMARY KEY (`user`,`interest`)
);

(對不起,我不記得如何在MySQL中設置FK關系,但我相信你可以很容易地解決這個問題。)

然后,確定每個用戶的“喜歡”數量:

SELECT COUNT(*)
FROM users
JOIN likes ON likes.user=users.id
WHERE users.name = 'bob';

然后確定兩個用戶有多少共同點:

SELECT COUNT(*)
FROM users AS u1
JOIN likes AS l1 ON (l1.user = u1.id)
JOIN likes AS l2 ON (l1.interest = l2.interest)
JOIN users AS u2 ON (l2.user = u2.id)
WHERE u1.name = 'bob'
    AND u2.name = 'alice';

然后根據這三個數字,您可以根據需要計算百分比 - 可能在您的客戶端代碼中,但如果需要,您可以使用子選擇在所有SQL端執行。

例:

USERS:
 id | name
----+-------
  1 | bob
  2 | alice

LIKES:
 user | interest
------+----------
    1 | fish
    1 | baseball
    2 | fish
    2 | cooking
    2 | baseball

運行bobalice的第一個查詢將顯示bob有2個興趣,並且Alice有3個興趣。 然后運行第二個查詢將顯示他們bob和alice一起有2個共同的興趣。

然后你可以向鮑勃展示愛麗絲分享他100%的興趣(2/2 = 100%),你可以向愛麗絲展示鮑勃共享66%(2/3 = 66%)的興趣。

你最好在PHP級別檢查一下。 考慮到每個用戶的興趣,您可以使用count()對array_intersect()的結果進行評分,以比較訪問者和其他用戶的興趣(http://www.php.net/manual/en/function.array-intersect。 PHP)。 如果你允許5個興趣,那就是(5 * count(array_intersect({params})))%。 對於不匹配,0%,4場比賽,80%。

這是我如何做到的。 假設$ like1,$ like2和$ like3是當前用戶的值:

SELECT (IF(like1='$like1',1,0) + IF(like2='$like2',1,0) + IF(like3='$like3',1,0))/3*100 match_percent,
COUNT(id)
FROM helloworld
GROUP BY match_percent;

這將使用您當前的架構:

select
    t2.id,
    t2.name
    sum(
        t1.like1 in (t2.like1, t2.like2, t2.like3, t2.like4, t2.like5) +
        t1.like2 in (t2.like1, t2.like2, t2.like3, t2.like4, t2.like5) +
        t1.like3 in (t2.like1, t2.like2, t2.like3, t2.like4, t2.like5) +
        t1.like4 in (t2.like1, t2.like2, t2.like3, t2.like4, t2.like5) +
        t1.like5 in (t2.like1, t2.like2, t2.like3, t2.like4, t2.like5)
    ) * 20 as percent_match
from helloworld t1
left join helloworld t2 on t1.id != t2.id
group by 1, 2
order by 3 desc;

這是有效的,因為在mysql中是true 1 - 總結真相將總數匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM