2012-01-26 42 views
1

前面的問題linky:MySQL Left Joins這甚至可能嗎?與左連接。此外MySQL查詢加入

非常親切,我們得到了下面的代碼工作:

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的talble還有另一個字段名爲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.

+0

這並沒有傷害鏈接到以前的問題,讓你到這一點。 – Sonny

+0

這已被添加桑尼 - 我們正在尋找的更多細節。 –

+0

你有一個錯誤:'COALESCE(COUNT(*),0)'應該是'COALESCE(COUNT(r.Name),0)'。對於不在「結果」表中的名稱,您會得到錯誤的結果(count = 1而不是0)。 –

回答

2

爲了讓剛剛從resultsName, q1=1, q1=2, q1=3表不僅可以使用:

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值,那麼在MySQL中無法做到這一點,除了寫出50萬次 - 不完全理想)。

與以前的查詢,或許是這樣的結合(在將其添加爲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

+0

感謝您的支持,它非常​​接近正確。但是,新代碼(添加到現有查詢中的位)會帶回與每個q1選項相同的計數,這是不正確的。事實上,如果時間'name'出現在結果中,它會帶回相同的計數:(任何想法? –

+0

嗯,查詢是否在其自己的工作中('SELECT Name ... FROM results GROUP BY name')? - 當我回家時,我會嘗試混合一個玩具數據庫來玩玩。 –

+0

不,運行直接查詢而不工作 - 這可能是問題:)提前致謝!:-) –