匹配数据库中用户常用数据的有效方式



一个例子:用户可以输入自己的爱好,比如"高尔夫、足球、网球"。我想列出所有有相同爱好的用户(或者只是其中一个(。

我的方法:数据库中名为"爱好"的字段,并用所有爱好填充,用逗号分隔,如上所述。然后我用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

游泳

约翰·

希望能有所帮助。

最新更新