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

时间:2016-10-23 14:34:50

标签: mysql sql

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

我的方法: 数据库中一个名为'hobbies'的字段,用所有爱好填充它,用上面的逗号分隔。然后我用php获取这些数据,填充数组并在循环中匹配用户。但似乎这是非常无趣的方式。

我想在数据库中的单独列中保存爱好,但是我必须设置最大限制,但仍然不确定如何匹配50个不同的列。

有人可以给我一些正确方向的建议吗?

1 个答案:

答案 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>

无肢

游泳

鲍勃

朱莉娅

编码

约翰

阿诺德

朱莉娅

无肢

希望它有所帮助。