MYSQL结合了两个使用相同列的计数

时间:2017-06-20 09:05:20

标签: mysql sql

我有两个查询需要合并到一个查询中。问题是他们在where子句中使用相同的列,具体取决于我需要获取的内容。

查询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

它们取决于名为' element'的相同列。

我如何将结果显示为

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

我想出了这个,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

2 个答案:

答案 0 :(得分:1)

使用CASE列表中的SELECT尝试使用ORed谓词和额外过滤的查询。

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

答案 1 :(得分: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