2011-07-12 15 views
3

でグループIは私が一つに結合したい3つのSELECTステートメントがあります。は1つのクエリに複数のカウントを組み合わせる -

SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname 
FROM feedbacks A 
    INNER JOIN users B 
     ON A.userid = B.userid 
WHERE DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' 
GROUP BY fullname 

SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname 
FROM feedbacks A 
    INNER JOIN users B 
     ON A.userid = B.userid 
WHERE status = 'C' 
AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' 
GROUP BY fullname` 

SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname 
FROM feedbacks A 
    INNER JOIN users B ON A.userid = B.userid 
WHERE caused_change = 1 
AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' 
GROUP BY fullname 

しかし、それらを組み合わせることで、常にエラーを返すように思われる:(オペランドが1列が含まれている必要があります( S))

SELECT 
(SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname) AS T1, 
(SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE status = 'C' AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname) AS T2, 
(SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE caused_change = 1 AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname) AS T3 

だから私は作るために、個々の文からJOINとGROUPを削除しようとした:

SELECT CONCAT(B.fname, ' ', B.lname) AS fullname, 
(SELECT COUNT(A.id) FROM feedbacks A WHERE DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11') AS T1, 
(SELECT COUNT(A.id) FROM feedbacks A WHERE status = 'C' AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11') AS T2, 
(SELECT COUNT(A.id) FROM feedbacks A WHERE caused_change = 1 AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11') AS T3 
FROM feedbacks 
    INNER JOIN users B 
     ON feedbacks.userid = B.userid 
GROUP BY fullname 

しかしトン帽子は、ユーザーによるブレークダウンとカウントダウンとの合計を返します(countはwhere句のユーザーIDまたはフルネームについては何も言いませんが、間違いありません)。

私は近くにいるが、何かが足りないと感じる。誰かがここで正しい方向に向けることができますか?私はちょうど私が間違っていることを学ぼうとしています。

ありがとうございます。

答えて

7

最良の方法は、使用することですSUM条件:私が以前にその日付範囲のすべての結果をつかみ、ロジックとカウントを実行するためにPHPを使用していた

SELECT CONCAT(B.fname, ' ', B.lname) AS fullname, 
     SUM(
      CASE WHEN DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' 
      THEN 1 ELSE 0 END 
     ) AS T1, 
     SUM(
      CASE WHEN status = 'C' 
       AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' 
      THEN 1 ELSE 0 END 
     ) AS T2, 
     SUM(
      CASE WHEN caused_change = 1 
       AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' 
      THEN 1 ELSE 0 END 
     ) AS T3 
FROM feedbacks 
    INNER JOIN users B 
     ON feedbacks.userid = B.userid 
GROUP BY fullname 
+0

ありがとう、Scorpi0(そして編集のために)。 – greatcaesarsghost

+0

ありがとう!これは今日非常に役立つことが判明しました。 –

+0

伝説の男たちは、今日私に深刻な時間を節約しました。乾杯!!。 – jiraiya

0

これら3つのクエリを1つの統合クエリにまとめることができるかどうかはわかりません。あなたは重なって3「where句」を持っている:

最初のクエリ:日付範囲で
2番目のクエリを秋のすべてのレコード:日付範囲に落ちるだけでなく、ステータスを持つすべてのレコード=「C」
3番目のクエリ:日付範囲に含まれているすべてのレコード。ただし、cause_change = 1

論理的には、最初のクエリには既に2番目と3番目のクエリのすべてのレコードが含まれているため、 #2および#3。

SELECT sum(cnt), fullname 
FROM (
    SELECT COUNT(A.id) as cnt, CONCAT(B.fname,' ', B.lname) AS fullname 
    FROM feedbacks A 
    INNER JOIN users B ON A.userid = B.userid 
    WHERE DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' 
    GROUP BY fullname 

    UNION 

    ... 
    WHERE status = 'C' AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' 

    UNION 

    ... 
    WHERE caused_change = 1 AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' 
) AS innerquery 
GROUP BY fullname 

なお、第1の内側のクエリでcount()の別名:あなたが単一の結果にすべての3つを組み合わせたいならば

しかし、その後、外側のクエリメソッドを実行します。それは、カウントされたフィールドを外部クエリの 'cnt'として表示するためです。

+0

。私には、DBに重労働をさせるべきだと私に示唆されました。説明する時間をとってくれてありがとう。 – greatcaesarsghost

0

UNIONとSUMが作業を行う必要があります。あなたのコードは次のようになります。

select sum(x.col1), x.fullname 
from 
(SELECT COUNT(A.id)as col1, CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname 
UNION 
SELECT COUNT(A.id)as col1, CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE status = 'C' AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname 
UNION 
SELECT COUNT(A.id)as col1, CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE caused_change = 1 AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname 
)x 
group by x.fullname 
関連する問題