【问题标题】:How to count specific value from multiple columns which references value from another table如何从引用另一个表中的值的多个列中计算特定值
【发布时间】:2020-10-26 05:32:42
【问题描述】:

我有两个如下所示的表格。

表历史记录:

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

但没用。

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

【问题讨论】:

  • 我建议更改您的表格设计并将所有六列移动到仅 一个 列中,并使用新的第二列来维护数据源。鉴于您当前的数据设计,您向我们提出的查询将非常难看。
  • 每一列的数字是唯一的吗?
  • @Nick 不,它们不是唯一的

标签: mysql select count


【解决方案1】:

您可以尝试在“日历”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

【讨论】:

  • 只是做一个演示,所以我已将其添加到您的答案中(希望您不介意)
  • 非常感谢您的帮助!它就像我想要的那样工作
  • @Nick 显而易见的问题是,你到底是怎么这么快就想出了一个演示的?我花了 5 分钟的时间拼命打字……这可能是几个月来最丑陋的设置。
  • “Text to DDL”是你的朋友……这就是我喜欢 db-fiddle 的原因,尽管有时有必要复制到 dbfiddle,因为 db-fiddle 没有足够多的可用 DBMS。
【解决方案2】:

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

SELECT s.ID, COUNT(his.x) AS Counted
FROM stats s
JOIN
(SELECT fir AS x FROM history
UNION
SELECT sec AS x FROM history
UNION
SELECT thi AS x FROM history
UNION
SELECT fou AS x FROM history
UNION
SELECT fif AS x FROM history
UNION
SELECT six AS x FROM history) AS his ON s.ID=his.x
GROUP BY s.ID

【讨论】:

    猜你喜欢
    • 2013-12-08
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多