【问题标题】:mysql, count distinct values between two tables (V2)mysql,计算两个表之间的不同值(V2)
【发布时间】:2019-04-26 18:30:19
【问题描述】:

我有两张桌子:

CREATE TABLE TableA  
(ID_A INT,   
 P1 INT,
 P2 INT,
 P3 INT,
 P4 INT,
 Nr1 INT,
 Nr2 INT,
 Nr3 INT,
 Nr4 INT);

INSERT INTO TableA VALUES
(1,3,4,3,5,2,3,1,4),
(2,5,4,3,4,1,1,1,2);

CREATE TABLE TableB
(ID_B INT,
NAME TEXT);

INSERT INTO TableB VALUES
(1,"A"),
(2,"B"),
(3,"C"),
(4,"D"),
(5,"E"),
(6,"F");

表格中的值

TableA
+------+----+----+----+-----+----+----+----+-----+
| ID_A | P1 | P2 | P3 | P4  | Nr1| Nr2| Nr3| Nr4 |
+------+----+----+----+-----+----+----+----+-----+
|    1 |  3 |  4 |  3 |   5 |  2 |  3 |  1 |  4  |
|    2 |  5 |  4 |  3 |   4 |  1 |  1 |  1 |  2  |
+------+----+----+----+-----+----+----+----+-----+

TableB
+------+------+
| ID_B | Name |
+------+------+
|    1 | A    |
|    2 | B    |
|    3 | C    |
|    4 | D    |
|    5 | E    |
|    6 | F    |
+------+------+

tableA P1 = TableB ID_B ,

tableA P2 = TableB ID_B ,

tableA P3 = TableB ID_B ,

tableA P4 = TableB ID_B

我想要 TableB 中与 P1、P2、P3、P4 对应的所有名称的总和;而Nr1, Nr2, Nr3, Nr4是数量:

P1 =SUM Nr1

P2 =SUM Nr2

P3 =SUM Nr3

P4 =SUM Nr4

我想得到这个:

+----------+------+
| COUNT(*) | Name |
+----------+------+
|        4 | C    |
|        6 | D    |
|        5 | E    |
+----------+------+

My DEMO db-fiddle.com

演示不累加Nr。

感谢那些帮助我的人。

【问题讨论】:

    标签: mysql group-by count


    【解决方案1】:

    在您的小提琴中,您没有选择相应的 Nr1/2/3/4 值。将它们添加到 select 子句并求和:

    SELECT Name, SUM(Val)
    FROM (
        SELECT TableB.Name, TableA.Nr1 AS Val FROM TableA JOIN TableB ON TableA.P1 = TableB.ID_B UNION ALL
        SELECT TableB.Name, TableA.Nr2 AS Val FROM TableA JOIN TableB ON TableA.P2 = TableB.ID_B UNION ALL
        SELECT TableB.Name, TableA.Nr3 AS Val FROM TableA JOIN TableB ON TableA.P3 = TableB.ID_B UNION ALL
        SELECT TableB.Name, TableA.Nr4 AS Val FROM TableA JOIN TableB ON TableA.P4 = TableB.ID_B
    ) AS x
    GROUP BY Name
    

    【讨论】:

    • 谢谢,它有效。如果值正确,我必须检查真实数据库。我在 TableA 中也​​有 DATE 我必须像这样使用它吗? SELECT TableB.Name, TableA.Nr1 AS Val, TableA.dateEND FROM TableA JOIN TableB ON TableA.P1 = TableB.ID_B UNION ALL ... ecc WHERE (dateEND >= '2019-01-01' AND dateEND
    • 可以,可以在里面的select子句中加上日期,在外面的where子句中使用。
    【解决方案2】:

    或者,如果您想在不需要子查询的情况下执行此操作:

      SELECT Name, 
             SUM(IF(P1 = ID_B, Nr1, 0) +
                 IF(P2 = ID_B, Nr2, 0) +
                 IF(P3 = ID_B, Nr3, 0) +
                 IF(P4 = ID_B, Nr4, 0))
        FROM TableA
        JOIN TableB ON (TableA.P1 = TableB.ID_B
                        OR TableA.P2 = TableB.ID_B
                        OR TableA.P3 = TableB.ID_B
                        OR TableA.P4 = TableB.ID_B)
    GROUP BY Name;
    

    【讨论】:

      【解决方案3】:

      您可以使用 select UNION ALL 和 group by

        select t2.name, count(*)
        from TableB t2
        inner join  (
        select  p1 p 
        from TableA 
        union all 
        select  p2
        from TableA 
        union all 
        select  p3
        from TableA 
        union all 
        select  p4
        from TableA 
        ) t on t.p = t2.ID_B
        group t2.name
        order by count(*) desc
      

      【讨论】:

      • 感谢您的来信。我试过你的代码,但它不起作用。
      • 我认为别名设置错误。它应该是TableB t2,而不是TableA t2。并且忘记在分组中添加BY。更正后,此查询运行良好。但是,它缺少需要加起来Nr%数量的OP条件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多