mysql - 计算逗号分隔值并获取另一个值的总和

标签 mysql

我有 2 张 table ;用户和意见。下面的示例架构和数据

users table
---------------------------------
userid
  1
  2
  3
  4
  5

opinions table
---------------------------------
opinionid   |   points   |   yes   |   no
    1             5         1,2,3      4,5
    2             5         1,3,5      2,4
    3            10         1,2,4      3,5
    4            10         1,4,5      2,3
    5            15           1      2,3,4,5

* the yes and no columns contains comma-delimited userids

期望的结果:按用户ID分组,按点排序,是,否

userid   |   points   |   yes   |   no
  1            45          5         0
  4            20          2         3
  2            15          2         3
  5            15          2         3
  3            10          2         3

Summary: for each userid, sum(points), count(yes), count(no)

谢谢!

最佳答案

你应该normalize您的数据,而不是将值存储为逗号分隔,这将更容易在查询中处理。只需添加一个新列 user_id 作为外键,并添加一个列作为标志 YesOrNo,然后为每个意见输入用户 ID,并为每个意见设置一个标志值 0 或1.


目前,您可以使用 FIND_IN_SET函数来执行您正在寻找的操作,如下所示:

SELECT
  userid,
  sum(CASE WHEN type = 'yes' THEN points ELSE 0 END), 
  SUM(CASE WHEN type = 'yes' THEN 1 ELSE 0 END) AS Yes,
  SUM(CASE WHEN type = 'no' THEN 1 ELSE 0 END) AS No
FROM
(
  SELECT 
    o.opinionid,
    o.points,
    'yes' AS type,
    u.userid
  FROM options AS o
  INNER JOIN users AS u ON FIND_IN_SET(u.userid, o.yes) <> 0
  UNION
  SELECT
    o.opinionid,
    o.points,
    'no' AS type,
    u.userid
  FROM options AS o
  INNER JOIN users AS u ON FIND_IN_SET(u.userid, o.no) <> 0
) AS t
GROUP BY userid;

关于mysql - 计算逗号分隔值并获取另一个值的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19093065/

相关文章:

具有 2 个表的 MySQL 内部连接查询

php - 如何重新排序搜索结果?

mysql - mysql 每个时期的总用户数

laravel 5.3中mysql和mongodb的关系

php - 如何向 value 属性添加另一个值?

php - 需要更新 codeigniter 上的用户表密码字段

php - 从小到大排序

php - 具有隐私的 Cakephp 复杂查询

php - 运行 100 多个 MySQL 更新查询。优化提示请:)

php - 数据库信息到Facebook Page Tab? XML 和 curl