![](/img/trans.png)
[英]How do i use a Fabrik (joomla component) form to connect to database table & search for match & return a result?
[英]PHP - MySQL Search database table return result with percentage match
在我的網站上,我允許用戶選擇他們喜歡或感興趣的內容。這是使用預定義的下拉菜單完成的,因此每次用戶登錄網站時,他們都會獲得與用戶相同的用戶列表。他們。
這是通過使用MySQL WHERE子句獲取登錄用戶的興趣(存儲在db中)並與站點上的其他用戶匹配來完成的。 但我遇到的問題是如何顯示每個用戶旁邊的百分比或分數,以顯示他們與登錄用戶興趣的匹配程度。
例如:
每個用戶有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
運行bob
和alice
的第一個查詢將顯示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.