0

ANDを使用したSQLクエリと少し混乱しています。

クエリは次のとおりです。

SELECT  count(cdr.id) as callTotal,
    sum(cdr.callDurationSeconds) as timeTotal,
    users.firstname,
    users.surname, 
    MAX(cdr.callDuration) as maxCallDuration,
    AVG(cdr.answeredTime) as avgAnswerTime,
    AVG(cdr.callDurationSeconds) as avgTimeTotal,
    cdr.userId, 
    COUNT(IF(cdr.callDurationSeconds > '0', 1, NULL)) AS answeredCalls
                 FROM cdr 
                 LEFT JOIN users ON cdr.userId = users.id
                 WHERE cdr.company = 'C47B0BCCDCE92F'
                 AND cdr.dateCreated LIKE '2012-11-02%'  
                 AND  cdr.userId = 'U4BC3128209B01'  
   OR  cdr.userId = 'U4A9FCCD73C6BB'  
   GROUP BY userId  ORDER BY users.surname ASC  ;

最後から2行目の日付でクエリを実行したいのですが、投稿されたcdr.userIdsのいずれかを使用してアイテムを取得したいと思います。ただし、この場合は日付を無視しているようです。日付をオプションではなく、選択した日付に選択したIDでデータを取得する必要があります。

4

4 に答える 4

3

ORSQLで/演算子の優先順位を操作したくない場合AND(これはかなり悪い考えです)、角かっこを追加するだけです。

AND  (cdr.userId = 'U4BC3128209B01'  OR  cdr.userId = 'U4A9FCCD73C6BB')

またはMartinSmithが指摘したように、あなたの場合は、IN

AND cdr.userId IN  ('U4BC3128209B01','U4A9FCCD73C6BB')
于 2012-11-02T16:10:02.627 に答える
1

OR他の人のように括弧で囲むか、このようにINを使用できます

SELECT  count(cdr.id) as callTotal,
                         sum(cdr.callDurationSeconds) as timeTotal,
                         users.firstname,
                         users.surname, 
                         MAX(cdr.callDuration) as maxCallDuration,
                         AVG(cdr.answeredTime) as avgAnswerTime,
                         AVG(cdr.callDurationSeconds) as avgTimeTotal,
                         cdr.userId, 
                         COUNT(IF(cdr.callDurationSeconds > '0', 1, NULL)) AS answeredCalls
                 FROM cdr 
                 LEFT JOIN users ON cdr.userId = users.id
                 WHERE cdr.company = 'C47B0BCCDCE92F'
                 AND cdr.dateCreated LIKE '2012-11-02%'  
                 AND  cdr.userId IN ('U4BC3128209B01','U4A9FCCD73C6BB')  GROUP BY userId  ORDER BY users.surname ASC  ;

そうORすれば、混乱はありません。

于 2012-11-02T16:11:24.070 に答える
1

私があなたを正しく理解しているなら、あなたはその日付のアイテムを選択し、特定のIDを持ちたいですか?

SELECT  count(cdr.id) as callTotal,
                         sum(cdr.callDurationSeconds) as timeTotal,
                         users.firstname,
                         users.surname, 
                         MAX(cdr.callDuration) as maxCallDuration,
                         AVG(cdr.answeredTime) as avgAnswerTime,
                         AVG(cdr.callDurationSeconds) as avgTimeTotal,
                         cdr.userId, 
                         COUNT(IF(cdr.callDurationSeconds > '0', 1, NULL)) AS answeredCalls
                 FROM cdr 
                 LEFT JOIN users ON cdr.userId = users.id
                 WHERE cdr.company = 'C47B0BCCDCE92F'
                 AND cdr.dateCreated LIKE '2012-11-02%'  
                     AND  cdr.userId IN('U4BC3128209B01','U4A9FCCD73C6BB')
                 GROUP BY userId  ORDER BY users.surname ASC  ;
于 2012-11-02T16:11:31.480 に答える
0

SQLでは、ANDはORよりも高い順序であるため、デフォルトではwhereは次のように解決されます。

             WHERE (cdr.company = 'C47B0BCCDCE92F'
             AND cdr.dateCreated LIKE '2012-11-02%'  
             AND  cdr.userId = 'U4BC3128209B01')  OR  cdr.userId = 'U4A9FCCD73C6BB'  

欲しいところ

             WHERE cdr.company = 'C47B0BCCDCE92F'
             AND cdr.dateCreated LIKE '2012-11-02%'  
             AND  (cdr.userId = 'U4BC3128209B01'  OR  cdr.userId = 'U4A9FCCD73C6BB')  

角かっこを使用すると、問題が解決します。

于 2012-11-02T16:10:24.280 に答える