一个例子:用户可以输入自己的爱好,比如"高尔夫、足球、网球"。我想列出所有有相同爱好的用户(或者只是其中一个(。
我的方法:数据库中名为"爱好"的字段,并用所有爱好填充,用逗号分隔,如上所述。然后我用php获取这些数据,填充一个数组,并在循环中匹配用户。但这似乎是一种非常不方便的方式。
我曾想过将爱好保存在数据库中的单独列中,但后来我不得不设置一个最大限制,仍然不确定如何与50个不同的列匹配。
有人能给我一个正确的建议吗?
以下是我的操作方法:
1( hobbies
表:
+----------+------------+
| id_hobby | hobby_name |
+----------+------------+
| 1 | Football |
| 2 | Tennis |
| 3 | Tennis |
| 4 | T.V. |
| 5 | Cars |
| 6 | Swimming |
| 7 | Coding |
+----------+------------+
2( users
表:
+---------+-----------+
| id_user | user_name |
+---------+-----------+
| 1 | Bob |
| 2 | John |
| 3 | Arnold |
| 4 | Mary |
| 5 | Julia |
| 6 | Amelia |
+---------+-----------+
3( users_hobbies
表:
+---------+----------+
| id_user | id_hobby |
+---------+----------+
| 1 | 2 |
| 1 | 4 |
| 1 | 6 |
| 2 | 7 |
| 3 | 3 |
| 3 | 4 |
| 3 | 1 |
| 3 | 7 |
| 4 | 5 |
| 5 | 6 |
| 5 | 7 |
| 5 | 2 |
| 6 | 3 |
| 6 | 5 |
| 6 | 7 |
+---------+----------+
然后使用php:进行此操作
// init DB connection
$db = new PDO('mysql:host=localhost;dbname=testing', $db_user, $db_passwd);
// build data arrays
try {
foreach ($db->query('
SELECT h.hobby_name, u.user_name FROM hobbies as h
LEFT JOIN users as u
INNER JOIN users_hobbies as uh
ON u.id_user = uh.id_user
ON h.id_hobby = uh.id_hobby
') as $row) {
$users_hobbies[] = $row;
$hobbies[] = $row['hobby_name'];
}
} catch (PDOExeption $e) {
print "Error! : " . $e->getMessage() . "<br />";
die();
}
// drop duplicates from $hobbies array
$hobbies = array_unique($hobbies);
// loop through new hobbies array and get users
foreach ($hobbies as $hobby) {
echo "<h2>" . $hobby . "</h2>";
foreach ($users_hobbies as $row) {
if ($row['hobby_name'] == $hobby) {
echo "<p>" . $row['user_name'] . "</p>";
}
}
}
输出:
足球
Arnold
网球
Bob Julia Arnold Amelia电视
Bob
阿诺德汽车
>Mary
Amelia游泳
约翰·
希望能有所帮助。