【问题标题】:adding and multiplying COUNT() of several tables多个表的 COUNT() 相加和相乘
【发布时间】:2012-10-19 00:21:30
【问题描述】:

是否可以将id相同的不同表的计数相加和相乘? 想象一下:

Table_1       Table_2    Table_3
id            id         id
1             1          1
1             2          2
2             2          3
3             2          3
3             2          3
3             3          3

所以最终结果将是这个有 2 列的表:

id        (COUNT(Table_1.id) + 2*COUNT(Table_2.id) + 3*COUNT(Table_3.id))
1                                   7
2                                   12
3                                   17

【问题讨论】:

    标签: php mysql optimization


    【解决方案1】:

    我不知道我是否理解正确,但请尝试一下,

    SELECT a.ID,
           a.aa + (2 * b.bb) + (3 * c.cc)
    FROM
      (
        SELECT ID, COUNT(*) aa
        FROM table1
        GROUP BY ID
      ) a LEFT JOIN
      (
        SELECT ID, COUNT(*) bb
        FROM table2
        GROUP BY ID
      ) b ON a.ID = b.ID
      LEFT JOIN
      (
        SELECT ID, COUNT(*) cc
        FROM table3
        GROUP BY ID
      ) c ON a.ID = c.ID
    

    SQLFiddle Demo

    【讨论】:

    • @AndreKR 如果 table1 上的记录在其他表上没有匹配项怎么办?它肯定不会出现在列表中。
    • 如果 Table_3 中的记录在其他表上没有匹配项怎么办?
    【解决方案2】:
    SELECT id, counts_1.number + 2 * counts_2.number + 3 * counts_3.number
    FROM
    (SELECT id, COUNT(*) AS number FROM Table_1 GROUP BY id) AS counts_1
    JOIN
    (SELECT id, COUNT(*) AS number FROM Table_2 GROUP BY id) AS counts_2 USING (id)
    JOIN
    (SELECT id, COUNT(*) AS number FROM Table_3 GROUP BY id) AS counts_3 USING (id)
    

    请注意,此解决方案要求每个 id 在每个表中至少存在一次,否则它将被排除在结果之外。改变这一点需要 MySQL 无法实现的 FULL OUTER JOIN。不过有ways around that limitation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 2018-05-10
      相关资源
      最近更新 更多