2017-06-20 9 views
0

1つのクエリに結合する必要のあるクエリが2つあります。問題は、私がフェッチする必要があるかどうかに応じてwhere句で同じ列を使用していることです。同じ列を使用する2つのカウントを結合するMYSQL

クエリ1

SELECT c.fullname, COUNT(DISTINCT sst.id) AS 'Liczba rozpoczetych szkolen' 
FROM mdl_course c 
INNER JOIN mdl_scorm s ON s.course = c.id 
INNER JOIN mdl_scorm_scoes_track sst ON s.id = sst.scormid 
INNER JOIN mdl_user u ON u.id = sst.userid 
WHERE sst.element = 'x.start.time' AND u.deleted =0 
GROUP BY c.fullname ORDER BY `Liczba rozpoczetych szkolen` ASC 

クエリ2

SELECT c.fullname, COUNT(DISTINCT sst.userid) AS 'Liczba_ukonczonych_szkolen' 
FROM mdl_course c 
INNER JOIN mdl_scorm s ON s.course=c.id 
INNER JOIN mdl_scorm_scoes_track sst ON s.id = sst.scormid 
INNER JOIN mdl_user u ON sst.userid=u.id 
where `element`='cmi.core.score.raw' and `value` = 100 and u.deleted = 0 
GROUP BY c.fullname ORDER BY `Liczba_ukonczonych_szkolen` DESC 

彼らは '要素' という名前の同じ列に依存しています。私は

fullname Liczba rozpoczetych szkolen Liczba_ukonczonych_szkolen 
    A1     34      4 
    A2     5      3 
    A3     34      33 

として結果を表示することができますどのように

は、私はこの1つ、whitch作品を思い付いてきました。おかげでアドバイス@HoneyBadgerため

SELECT t1.fullname, t1.Liczba_rozpoczetych_szkolen, t2.Liczba_ukonczonych_szkolen, 
    round(((t2.Liczba_ukonczonych_szkolen /t1.Liczba_rozpoczetych_szkolen)*100),2) as procentowo 
    FROM 
    (SELECT c.fullname, COUNT(DISTINCT sst.id) AS Liczba_rozpoczetych_szkolen 
    FROM mdl_course c 
    INNER JOIN mdl_scorm s ON s.course = c.id 
    INNER JOIN mdl_scorm_scoes_track sst ON s.id = sst.scormid 
    INNER JOIN mdl_user u ON u.id = sst.userid 
    WHERE sst.element = 'x.start.time' AND u.deleted =0 
    GROUP BY c.fullname) AS t1, 
    (SELECT c.fullname, COUNT(DISTINCT sst.userid) AS Liczba_ukonczonych_szkolen 
    FROM mdl_course c 
    INNER JOIN mdl_scorm s ON s.course=c.id 
    INNER JOIN mdl_scorm_scoes_track sst ON s.id = sst.scormid 
    left join mdl_user u ON sst.userid=u.id 
    where `element`='cmi.core.score.raw' and `value` = 100 and u.deleted = 0 
    GROUP BY c.fullname) as t2 
    WHERE t1.fullname = t2.fullname 
+0

は 'fullname' – HoneyBadger

+0

@HoneyBadgerに一緒に2つのクエリに参加し、私の編集を確認してください。あなたの考えはこれですか? – Jotosha

+0

あなたのLEFT JOINは、ヌル以外の述語である 'u.deleted = 0'でWHEREに制限されたINNERです。本当ですか? – Serg

答えて

1

の種類:

SELECT  COALESCE(R.fullname, U.fullname) AS fullname 
,   COALESCE(R.Liczba_rozpoczetych_szkolen, 0) AS Liczba_rozpoczetych_szkolen 
,   COALESCE(R.Liczba_ukonczonych_szkolen, 0) AS Liczba_ukonczonych_szkolen 
FROM  (
       SELECT  c.fullname 
       ,   COUNT(DISTINCT sst.id) AS Liczba_rozpoczetych_szkolen 
       FROM  mdl_course c 
       INNER JOIN mdl_scorm s 
         ON s.course = c.id 
       INNER JOIN mdl_scorm_scoes_track sst 
         ON s.id = sst.scormid 
       INNER JOIN mdl_user u 
         ON u.id = sst.userid 
       WHERE  sst.element = 'x.start.time' 
         AND u.deleted =0 
       GROUP BY c.fullname 
      ) AS R 
FULL JOIN (
       SELECT  c.fullname 
       ,   COUNT(DISTINCT sst.userid) AS Liczba_ukonczonych_szkolen 
       FROM  mdl_course c 
       INNER JOIN mdl_scorm s 
         ON s.course=c.id 
       INNER JOIN mdl_scorm_scoes_track sst 
         ON s.id = sst.scormid 
       INNER JOIN mdl_user u 
         ON sst.userid=u.id 
       where  `element`='cmi.core.score.raw' 
         AND `value` = 100 
         AND u.deleted = 0 
       GROUP BY c.fullname 
      ) AS U 
     ON R.fullname = U.fullname 
1

SELECTリストでCASEとOR述語と余分なフィルタリングを使用してクエリを試してみてください。あなたは、このようにそれらを一緒に参加することができ

SELECT c.fullname, COUNT(DISTINCT CASE WHEN sst.element = 'x.start.time' THEN sst.id END) AS 'Liczba rozpoczetych szkolen' 
, COUNT(DISTINCT CASE WHEN sst.element = 'cmi.core.score.raw' and `value` = 100 THEN sst.userid END) AS 'Liczba_ukonczonych_szkolen' 
FROM mdl_course c 
INNER JOIN mdl_scorm s ON s.course = c.id 
INNER JOIN mdl_scorm_scoes_track sst ON s.id = sst.scormid 
INNER JOIN mdl_user u ON u.id = sst.userid 
WHERE sst.element = IN('x.start.time', 'cmi.core.score.raw') AND u.deleted =0 
GROUP BY c.fullname ORDER BY `Liczba rozpoczetych szkolen` ASC 
関連する問題