首页 > 解决方案 > 如何从引用另一个表中的值的多个列中计算特定值

问题描述

我有两张桌子,如下所示。

表历史:

+------+------+------+-----+------+------+
| 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

但没有用。

我可以通过一个查询获得我想要的结果吗?

标签: mysqlselectcount

解决方案


您可以尝试在“日历”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。我们需要做这个联合意味着也许你的表设计实际上应该只有一个逻辑列,第二列维护每个点的数据源。

演示


推荐阅读