2012-11-02 51 views
0

我对使用AND进行SQL查询有点困惑。SQL与AND混淆

查询如下:

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 ; 

我想通过在倒数第二行的日期进行查询,但后来我想与任何发布cdr.userIds的检索项目。然而,在这种情况下,它似乎无视日期。我需要日期为非可选日期,并在选定日期检索具有选定ID的任何数据。

回答

0

在SQL,默认情况下具有更高的订单,然后左右你在那里解析为

   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') 

使用括号,它会清除事情。

3

如果您不想玩OR/AND SQL中的运算符优先级(这是一个相当糟糕的主意),只需添加括号即可。

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

或由马丁·史密斯指出,在你的情况下,使用IN

AND cdr.userId IN ('U4BC3128209B01','U4A9FCCD73C6BB') 
+0

或可以用'AND cdr.userId IN( 'U4BC3128209B01', 'U4A9FCCD73C6BB')' –

+0

@MartinSmith哦,是的,当然! –

1

您可以用括号包裹OR像其他人所说,或者使用在这样

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,所以没有混乱

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 ;