Это вообще возможно? Дальнейший MySQL запрос в связи с Left Join - PullRequest
1 голос
/ 26 января 2012

Предыдущий вопрос 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

В дополнение к тому, что эта информация содержится в таблицах acme и results, нам также необходимо вернуть дополнительную информацию. Таблица «Результаты» выглядит следующим образом:

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

Я бы хотел добавить к этому запросу, в значении results есть еще одно поле с именем q1. В нем может быть число: 1, 2 или 3 - я бы хотел вернуть количество раз, когда появляется 1,2 или 3 (количество) для каждого из Name, который также появляется в таблице. Имеет смысл?

Обычно запрос должен выглядеть примерно так:

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

Я, наверное, выхожу здесь на конечность, но можно ли это сделать ???

Заранее спасибо,

H.

1 Ответ

2 голосов
/ 27 января 2012

Чтобы получить только таблицу 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 вы хотите иметь столбцы.(Если бы, скажем, было полмиллиона значений q1, в MySQL не было бы никакого способа, кроме как выписать COUNT(IF(q1=i,1,0)) AS q1isi полмиллиона раз - не совсем идеально).возможно что-то вроде этого (добавьте это как 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 кунг-фу закончился: P

...