这甚至可能吗?与Left Join相关的进一步MySQL查询

时间:2012-01-26 16:48:40

标签: mysql join count left-join

上一个问题linky:MySQL Left Joins

非常友善,我们得到了以下代码:

select
      JustACME.Name,
      JustACME.NameCount,
      COALESCE( COUNT( * ), 0 ) as CountFromResultsTable
   from
      ( select a.Name,
               count(*) as NameCount
           from
              acme a
           group by
              a.Name ) JustACME

      LEFT JOIN results r
         on JustACME.Name = r.Name
   group by
      JustACME.Name

上述代码完全按照我们的需要运行,并带回以下内容

Name     Count     Total
Tom      10        5
Bon      9         4

除了acmeresults表中的信息之外,我们还需要提供更多信息。 '结果'表格如下:

Name     q1
Tom      1
Tom      2
Tom      1
Bob      3
Bob      2
Bob      1
Bob      2

我想添加到此查询中,在名为results的高音中,还有另一个名为q1的字段。这可以有一个数字,1,2或3 - 我想做的是恢复每个Name的1,2或3出现(计数)的次数也出现在表格中。有意义吗?

基本上,查询的输出应该是这样的:

Name     Count     Total     q1 = 1    q1 = 2     q1 = 3
Bob      9         4         1         2          1
Tom      10        5         4         1          0

我可能会在这里走出困境,但可以做到吗?

提前致谢,

小时。

1 个答案:

答案 0 :(得分:2)

要仅从Name, q1=1, q1=2, q1=3获取results表格,您只能使用:

SELECT Name,
       COUNT(IF(q1=1,1,NULL)) as q1is1, 
       COUNT(IF(q1=2,1,NULL)) as q1is2,
       COUNT(IF(q1=3,1,NULL)) as q1is3
FROM results
GROUP BY Name

这会计算每个结果的出现次数(每个名称) - 这是有效的,因为您只需要三个额外的列,并且知道您希望有哪些列的q1值。 (如果说有50万q1值,除了写出COUNT(IF(q1=i,1,0)) AS q1isi 50万次之外,没有办法在MySQL中做到这一点 - 不完全理想。)

要与之前的查询结合使用,可能会这样(将其添加为JOIN):

select
  JustACME.Name,
  JustACME.NameCount,
  COALESCE( COUNT( * ), 0 ) as CountFromResultsTable,
  r2.q1is1, r2.q1is2, r2.q1is3                     -- <-- grab those extra rows
from
  ( select a.Name,
           count(*) as NameCount
       from
          acme a
       group by
          a.Name ) JustACME

  LEFT JOIN results r
     on JustACME.Name = r.Name
  LEFT JOIN (SELECT Name,                          -- <-- add the new table in
                 COUNT(IF(q1=1,1,NULL)) as q1is1, 
                 COUNT(IF(q1=2,1,NULL)) as q1is2,
                 COUNT(IF(q1=3,1,NULL)) as q1is3
             FROM results
             GROUP BY Name) r2
     ON JustACME.Name = r2.Name
group by
  JustACME.Name

事实上,我确信有一种方法可以在不需要LEFT JOIN子查询的情况下执行此操作,但我的mysql kung fu已经用完了:P