【问题标题】:efficient way to match users common data in the database? [duplicate]匹配数据库中用户常用数据的有效方法? [复制]
【发布时间】:2017-03-05 09:16:29
【问题描述】:

示例:用户可以输入他的爱好,例如“高尔夫、足球、网球”。 我想列出所有具有相同爱好的用户(或仅列出其中一个)。

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

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

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

【问题讨论】:

  • 对爱好使用归一化,否则无法正确匹配
  • 在逗号分隔的字段中存储多个值不是表示数据的 SQL 方式。为每个用户和爱好组合使用带有单独行的表格。

标签: mysql sql


【解决方案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>";
        }
    }
}

输出:

足球

阿诺德

网球

鲍勃

朱莉娅

阿诺德

阿米莉亚

电视

鲍勃

阿诺德

汽车

玛丽

阿米莉亚

游泳

鲍勃

朱莉娅

编码

约翰

阿诺德

朱莉娅

阿米莉亚

希望对你有帮助。

【讨论】:

  • 谢谢!这给了我正确的提示,现在我知道下一步该做什么了。
  • 请记住,这是您需要的简单实现。您最好阅读您的问题重复的主题。
猜你喜欢
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 2021-09-13
  • 1970-01-01
相关资源
最近更新 更多