一个例子:用户可以输入自己的爱好,比如“高尔夫,足球,网球”。 我想列出所有具有相同爱好(或者只是其中一个)的用户。
我的方法: 数据库中一个名为'hobbies'的字段,用所有爱好填充它,用上面的逗号分隔。然后我用php获取这些数据,填充数组并在循环中匹配用户。但似乎这是非常无趣的方式。
我想在数据库中的单独列中保存爱好,但是我必须设置最大限制,但仍然不确定如何匹配50个不同的列。
有人可以给我一些正确方向的建议吗?
答案 0 :(得分:1)
我将如何做到这一点:
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>";
}
}
}
输出:
足球
阿诺德
网球
鲍勃
朱莉娅
阿诺德
无肢
TV
鲍勃
阿诺德
汽车
玛丽< / p>
无肢
游泳
鲍勃
朱莉娅
编码
约翰
阿诺德
朱莉娅
无肢
希望它有所帮助。