【问题标题】:Mysql complex data issueMysql复杂数据问题
【发布时间】:2017-04-18 13:41:22
【问题描述】:

我有一个文章网站,我有一个建议框,我建议在其中阅读更多文章。我想做的是建议最相关的测验,而不是挑选随机文章并展示它们。 所以让我们假设读者正在阅读 id 为 19 的文章。在建议框中,我想显示那些也阅读第 19 号文章的人阅读过的文章。因此,如果 A 阅读 19、26、30 和 B正在阅读 19,因此他对第 26,30 条最感兴趣。 我有一张表,我在上面记录用户阅读的每篇文章及其用户 ID。

ID / USER ID / ARTICLEID
1 / 30       / 10
2 / 20       / 10
3 / 20       / 80
4 / 10       / 10
5 / 20       / 60
6 / 10       / 60
7 / 20       / 80
8 / 10       / 90

这是想要的:获取用户当前正在阅读的文章的 ID -> 转到数据库并获取阅读这篇文章的所有用户的 ID -> 获取这些用户阅读的所有文章的 ID ->按文章的用户数量对它们进行排序。 这真的很令人沮丧,因为我没有太多的 mysql 经验。所以 select 的基本命令似乎不起作用,我正在寻求帮助或只是想法,我会寻求执行它们。 更新 1:需要输出

  • 获取阅读文章 id 10 的用户的用户 ID:IDS : 30/10/20
  • 查看此用户还阅读了哪些其他文章:80(1 用户)/60(2用户)/90(1用户)
  • 所以最终输出:按顺序排列的文章:60/90/80

【问题讨论】:

  • 同时发布所需的输出以查看预期的结果。
  • @Rahul 检查更新,如果清楚请告诉我
  • 看来你需要一些mysql教程网站。
  • @Drew 你应该知道我有 7500 万条记录的表,所以这并不容易
  • 你可以有 20 行,同样的交易。创建一个只有几行的数据库并学习使用 mysql 编程。这是您的第四个问题,他们都没有代码尝试,除了 where id=9 一个。你需要做你的部分。

标签: mysql


【解决方案1】:

我做了一个样品。我几乎可以肯定这就是您搜索的内容。 我将描述它一些片段

完整的查询

SELECT count(`art_id`) as cnt, `art_id`
FROM user_art 
WHERE `user_id` in (
        SELECT DISTINCT `user_id`
        FROM user_art
        WHERE `art_id` = 10 -- Current Article ID to find other user
        AND user_id <> 20   -- Current User Id to exclude from list
        )
GROUP by `art_id`
ORDER BY cnt DESC , `art_id` DESC
LIMIT 1;

一步一步

输入数据

mysql>  SELECT * FROM user_art;
+----+---------+--------+
| id | user_id | art_id |
+----+---------+--------+
|  1 |      10 |     10 |
|  2 |      20 |     30 |
|  3 |      20 |     80 |
|  4 |      10 |     90 |
|  5 |      20 |     10 |
|  6 |      23 |     10 |
|  7 |      23 |     11 |
|  8 |      23 |     12 |
|  9 |      10 |     11 |
+----+---------+--------+
9 rows in set (0,00 sec)

mysql>

查找所有同时阅读 sam 文章的用户 ID

mysql> select DISTINCT `user_id`
    -> FROM user_art
    -> WHERE `art_id` = 10 -- Current Article ID to find other user
    -> AND user_id <> 20;  -- Current User Id to exclude from list
+---------+
| user_id |
+---------+
|      10 |
|      23 |
+---------+
2 rows in set (0,00 sec)

mysql>

查找用户列表阅读的所有文章

查找所有按用户列表阅读的文章,并按用户 desc 和文章 id desc => 更高的 article_no = > 较新的文章排序

mysql> SELECT count(`art_id`) as cnt, `art_id`
    -> FROM user_art
    -> WHERE `user_id` in (10,23)
    -> GROUP by `art_id`
    -> ORDER BY cnt DESC , `art_id` DESC
    -> ;
+-----+--------+
| cnt | art_id |
+-----+--------+
|   2 |     11 |
|   2 |     10 |
|   1 |     90 |
|   1 |     12 |
+-----+--------+
4 rows in set (0,00 sec)

mysql>

两个查询的组合

将两个查询与 LIMIT 结合起来,只得到下一篇文章

mysql> SELECT count(`art_id`) as cnt, `art_id`
    -> FROM user_art
    -> WHERE `user_id` in (
    ->         SELECT DISTINCT `user_id`
    ->         FROM user_art
    ->         WHERE `art_id` = 10 -- Current Article ID to find other user
    ->         AND user_id <> 20   -- Current User Id to exclude from list
    ->         )
    -> GROUP by `art_id`
    -> ORDER BY cnt DESC , `art_id` DESC
    -> LIMIT 1;
+-----+--------+
| cnt | art_id |
+-----+--------+
|   2 |     11 |
+-----+--------+
1 row in set (0,00 sec)

mysql>

【讨论】:

  • 完美的兄弟!
猜你喜欢
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 2016-06-18
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多