【问题标题】:Getting duplicated sql result获取重复的sql结果
【发布时间】:2017-04-23 07:05:22
【问题描述】:

我有 3 个表:Users、Articles 和 Votes

| Users |    | Articles |    |   Votes   |
|   id  |    |    id    |    |  userId   |
|  name |    |  title   |    | articleId |
| email |    |  userId  |    |    type   |

我想获得每个用户的 Count voteup 和 Count votedown 用户列表。

我正在测试这个查询:

SELECT u.id,u.name,u.email,
(SELECT COUNT(*) FROM votes as v WHERE v.type=1 AND v.articleId IN 
   (SELECT a.id From articles as a WHERE a.userId = u.id) ) AS totalvoteup,
(SELECT COUNT(*) FROM votes as v WHERE v.type=0 AND v.articleId IN 
   (SELECT a.id From articles as a WHERE a.userId = u.id) ) AS totalvotedown
FROM users as u

当我通过 phpmyadmin 测试它时,我有我想要的列表(结果数与表中的用户数匹配),但是当我尝试通过节点服务器(来自 AngularJs 或 Postman)时,我得到了重复结果:

{
"users": [
[
  {
    "id": 1,
    "name": "John Lennon",
    "email": "johnlennon@gmail.com",
    "totalvoteup": 0,
    "totalvotedown": 0
  },
  {
    "id": 2,
    "name": "John Lennon 2",
    "email": "johnlennon2@gmail.com",
    "totalvoteup": 0,
    "totalvotedown": 0
  },
  {
    "id": 3,
    "name": "John Lennon 3",
    "email": "johnlennon3@gmail.com",
    "totalvoteup": 0,
    "totalvotedown": 1
  },
  {
    "id": 4,
    "name": "John Lennon 4",
    "email": "johnlennon4@gmail.com",
    "totalvoteup": 0,
    "totalvotedown": 0
  }
],
[
  {
    "id": 1,
    "name": "John Lennon 1",
    "email": "johnlennon1@gmail.com",
    "totalvoteup": 0,
    "totalvotedown": 0
  },
  {
    "id": 2,
    "name": "John Lennon 2",
    "email": "johnlennon2@gmail.com",
    "totalvoteup": 0,
    "totalvotedown": 0
  },
  {
    "id": 3,
    "name": "John Lennon 3",
    "email": "johnlennon3@gmail.com",
    "totalvoteup": 0,
    "totalvotedown": 1
  },
  {
    "id": 4,
    "name": "John Lennon 4",
    "email": "johnlennon4@gmail.com",
    "totalvoteup": 0,
    "totalvotedown": 0
  }
]
]
}

任何想法如何解决这个问题?

【问题讨论】:

  • 请通过以下方式更新您的问题:a) 显示表的最小样本数据集,b) 显示您将在 MySQL 中获得的实际输出,而不是难以阅读的 JSON 输出。

标签: mysql sql angularjs node.js


【解决方案1】:

我不是 Java 人,不确定问题所在,但查询可以用更好的方式编写

SELECT DISTINCT u.id,
       u.name,
       u.email,
       coalesce(totalvoteup,0) as totalvoteup,
       coalesce(totalvotedown,0) as totalvotedown
FROM   users AS u
       LEFT JOIN (SELECT DISTINCT id,userId FROM articles) a
              ON a.userId = u.id
       LEFT JOIN (SELECT Count(CASE WHEN v.type = 1 THEN 1 END) AS totalvoteup,
                         Count(CASE WHEN v.type = 0 THEN 1 END) AS totalvotedown,
                         v.articleId
                  FROM   votes v
                  GROUP  BY v.articleId) v
              ON a.id = v.articleId 

由于我喜欢查询优化,可能无法帮助您解决刚刚想到分享的问题

【讨论】:

  • 投票表中的userId键是指投票的用户,而不是文章所有者。所以你的查询给了我每个用户的总投票数,而不是他们收到的投票数
  • @AmadouBeye - 立即查看
  • 它给了我重复的结果,但我通过在第一个 SELECT 旁边添加 DISCTINCT 来解决它。然而,当用户没有文章时,totalvoteup 和 totalvotedown 设置为 NULL。如何改为 0?
  • @AmadouBeye - 使用 COALESCE.. 更新
  • 明白了!你的查询比我的快!谢谢但我仍然得到重复的结果:(
猜你喜欢
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 2023-03-21
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多