mysql - 如何从引用另一个表中的值的多个列中计算特定值
问题描述
我有两张桌子,如下所示。
表历史:
+------+------+------+-----+------+------+
| fir | sec | thi | fou | fif | six |
+------+------+------+-----+------+------+
| 10 | 23 | 29 | 33 | 37 | 40 |
| 9 | 13 | 21 | 25 | 32 | 42 |
| 11 | 16 | 19 | 21 | 27 | 31 |
| 14 | 27 | 30 | 31 | 40 | 42 |
| 16 | 24 | 29 | 40 | 41 | 42 |
| 14 | 15 | 26 | 27 | 40 | 42 |
| 2 | 9 | 16 | 25 | 26 | 40 |
| 8 | 19 | 25 | 34 | 37 | 39 |
| 2 | 4 | 16 | 17 | 36 | 39 |
| 9 | 25 | 30 | 33 | 41 | 44 |
| 1 | 7 | 36 | 37 | 41 | 42 |
| 2 | 11 | 21 | 25 | 39 | 45 |
| 22 | 23 | 25 | 37 | 38 | 42 |
| 2 | 6 | 12 | 31 | 33 | 40 |
| 3 | 4 | 16 | 30 | 31 | 37 |
表格统计:
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
| 20 |
所以表历史记录有 6 列。所有 6 列都有不同的值,可以填充从 1 到 45 的值。表 stats 的 id 列从 1 到 45。
我想要的是从表历史记录中计算“id”值,并将另一列作为结果。
我试过了
select id from stats as num right join (select count(*) as count from history where fir = num.id OR sec = num.id OR thi = num.id OR fou = num.id OR fif = num.id OR six = num.id) as r
但没有用。
我可以通过一个查询获得我想要的结果吗?
解决方案
您可以尝试在“日历”stats
表和当前数据的联合之间进行左连接。
SELECT
s.id,
COUNT(t.val) AS count
FROM stats s
LEFT JOIN
(
SELECT fir AS val FROM history UNION ALL
SELECT sec FROM history UNION ALL
SELECT thi FROM history UNION ALL
SELECT fou FROM history UNION ALL
SELECT fif FROM history UNION ALL
SELECT six FROM history
) t
ON s.id = t.val
GROUP BY
s.id;
请注意,在使用 进行重叠检查之前,我们将所有六列合并到一个逻辑列中stats
。我们需要做这个联合意味着也许你的表设计实际上应该只有一个逻辑列,第二列维护每个点的数据源。
演示
推荐阅读
- php - 未捕获的 PDOException:SQLSTATE[HY093]:无效的参数号:绑定变量的数量与标记的数量不匹配
- c++ - 为什么在 C++ 中添加数组元素时我会得到非常大的数字?
- javascript - 使用 call/apply 或直接调用函数有什么区别?
- node.js - 如何重塑 GraphQL 响应?
- android - 将多用户从 csv 或 excel 导入到 firbase auth
- angular - 同一页面中的角度路由
- docker - Docker 发布选项
- sublimetext3 - Sublime text-in 快速查找下一个,你怎么只找到'整个单词'
- html - 表格未正确插入堵塞
- c# - 如何从孩子中的孩子访问列表?