如何从多个列中计算特定值,这些列引用另一个表中的值

时间:2020-10-26 05:32:42

标签: mysql select count

我有两个如下表。

表格历史记录:

+------+------+------+-----+------+------+
| 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之间的值。 表格统计信息的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

但是没有用。

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

2 个答案:

答案 0 :(得分:2)

您可以尝试在“日历” 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进行重叠检查。我们需要进行这种并集意味着,也许您的表设计实际上应该只包含一个逻辑列,而第二个列维护每个点的数据源。

Demo

答案 1 :(得分:0)

是的,只是一个想法,但是您可以使用UNION,但是也许有更好的解决方案

//Add items
MyListView.Focus(FocusState.Pointer);
相关问题