0

我的表结构:

古兰经大师

在此处输入图像描述

古兰经祈祷:

在此处输入图像描述

我想根据我的时间戳制作结果。

表示要根据时间戳获取 sipara 的计数。

为此我做了以下查询:

SELECT  qm.sipara, Prayed = COUNT(qp.Sipara) 
FROM    QuranMaster qm LEFT JOIN QuranPrayed qp ON qp.sipara=qm.sipara
where qp.TimeStamp between '2013-10-27 19:59:00.000' and '2013-10-28 20:00:00.000'
GROUP BY qm.sipara,qm.OrderID order by qm.OrderID

但它没有给出 0 次祈祷 siparas 的结果。

其给出如下:

在此处输入图像描述

它还应该将 sipara4 显示为 0,将 sipara5 显示为 0...等。

请帮我。

4

4 回答 4

3

尝试这个

SELECT qm.sipara, 
       Prayed = COUNT(qp.Sipara) 
FROM QuranMaster qm LEFT JOIN 
     QuranPrayed qp ON (qp.sipara = qm.sipara AND qp.TimeStamp >= '2013-10-27 19:59:00.000' AND qp.TimeStamp <= '2013-10-28 20:00:00.000')
GROUP BY qm.sipara,qm.OrderID 
ORDER BY qm.OrderID

基本上,您的 WHERE 子句过滤掉了行,因此将 WHERE 子句中的时间戳条件移动到 LEFT JOIN 子句,这意味着您可以包含 QuranMaster 中的所有行,然后仅在 QuranPrayed 中满足那些记录的计数时间戳条件,否则那些不满足时间戳条件的记录不被加入,因此不包括在计数中

于 2013-10-29T11:16:33.310 回答
2

问题是您的时间戳之间正在删除您想要求和的记录。先做总和,然后从主人那里左加入。

SELECT  
  qm.sipara
, vsum.Prayed
From QuranMaster qm 
LEFT JOIN 
(
    Select
      qp.sipara
    , Prayed = COUNT(qp.Sipara) 
    From QuranPrayed qp
    GROUP BY qp.sipara
) vsum  
ON vsum.sipara=qp.sipara
于 2013-10-29T11:17:28.327 回答
1

使用Sipara字段 fromQuranMaster而不是QuranPrayedinCOUNT(...)

SELECT  qm.sipara, 
        Prayed = COUNT(qm.Sipara) 
FROM    QuranMaster qm 
        LEFT JOIN QuranPrayed qp 
            ON qp.sipara=qm.sipara
where   qp.TimeStamp between '2013-10-27 19:59:00.000' and '2013-10-28 20:00:00.000'
GROUP BY qm.sipara,qm.OrderID 
ORDER BY qm.OrderID

我也建议不要使用BETWEENbut>=<

SELECT  qm.sipara, 
        Prayed = COUNT(qm.Sipara) 
FROM    QuranMaster qm 
        LEFT JOIN QuranPrayed qp 
            ON qp.sipara=qm.sipara
where   qp.TimeStamp >='2013-10-27 19:59:00.000' 
        and qp.TimeStamp < '2013-10-28 20:00:00.000'
GROUP BY qm.sipara,qm.OrderID 
ORDER BY qm.OrderID
于 2013-10-29T11:07:37.700 回答
1

您的 WHERE 子句正在过滤掉没有子行的父行。将该条件移至 JOIN:

SELECT  qm.sipara, 
        Prayed
FROM    QuranMaster qm 
LEFT JOIN QuranPrayed qp 
    ON qp.sipara=qm.sipara
        AND qp.TimeStamp between '2013-10-27 19:59' and '2013-10-28 20:00'
GROUP BY qm.sipara,
         qm.OrderID 
ORDER BY qm.OrderID

或者在子查询中进行分组:

SELECT  qm.sipara, 
        Prayed = COUNT(qm.Sipara) 
FROM    QuranMaster qm 
LEFT JOIN (
    SELECT sipara, 
           Prayed = COUNT(*) 
    FROM QuranPrayed 
    WHERE TimeStamp between '2013-10-27 19:59' and '2013-10-28 20:00'
    GROUP BY qm.sipara ) QP
    ON qp.sipara=qm.sipara
ORDER BY qm.OrderID
于 2013-10-29T11:15:58.193 回答