How can I make two condition in having clause

前端 未结 4 1688
傲寒
傲寒 2021-01-02 07:47

I have a table similar to:

domain      |   file      | Number 
------------------------------------     
aaa.com     | aaa.com_1   | 111
bbb.com     | bbb.co         


        
相关标签:
4条回答
  • 2021-01-02 08:00

    You cannot have the file name in the SELECT statement if it is not also in the GROUP BY. You have to get your GROUP BY result than JOIN back to the original and add the filter logic like so:

    SELECT *
    FROM
    (
     select count(domain) as 'sum_domains', Number
     from table 
     group by Number
     having
     count(Number) >1
    ) result
    join table t on result.Number = t.Number
    WHERE file like '%\_1'
    
    0 讨论(0)
  • 2021-01-02 08:01

    i am using by following

    having ( SUM(qty) > 4 AND SUM(qty) < 15 )
    
    0 讨论(0)
  • 2021-01-02 08:04

    Try the nested query below:

      select count(domain) as 'sum domains', domain as fileName
      from 
       (select domain, file from tableName
        group by Number
        having count(Number) >1) as temp
      WHERE file like '%\_1';
    
    0 讨论(0)
  • 2021-01-02 08:12

    As documented under SELECT Syntax:

    The HAVING clause is applied nearly last, just before items are sent to the client, with no optimization.

    In other words, it is applied after the grouping operation has been performed (in contrast with WHERE, which is performed before any grouping operation). See WHERE vs HAVING.

    Therefore, your current query first forms the resultset from the following:

    SELECT   COUNT(domain) AS `sum domains`, file
    FROM     `table`
    GROUP BY Number
    

    See it on sqlfiddle:

    | SUM DOMAINS |      FILE |
    ---------------------------
    |           2 | aaa.com_1 |
    |           2 | bbb.com_1 |
    |           1 | eee.com_1 |
    

    As you can see, the values selected for the file column are merely one of the values from each group—as documented under MySQL Extensions to GROUP BY:

    The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate.

    Your current query then proceeds to filter these results according to your HAVING clause:

    HAVING   COUNT(Number) > 1 AND file LIKE '%\_1'
    

    With the values of file selected above, every single group matches on the second criterion; and the first two groups match on the first criterion. Therefore the results of the complete query are:

    | SUM DOMAINS |      FILE |
    ---------------------------
    |           2 | aaa.com_1 |
    |           2 | bbb.com_1 |
    

    Following your comments above, you want to filter the records on file before grouping and then filter the resulting groups for those containing more than one match. Therefore use WHERE and HAVING respectively (and select Number instead of file to identify each group):

    SELECT   Number, COUNT(*) AS `sum domains`
    FROM     `table`
    WHERE    file LIKE '%\_1'
    GROUP BY Number
    HAVING   `sum domains` > 1
    

    See it on sqlfiddle:

    | NUMBER | SUM DOMAINS |
    ------------------------
    |    222 |           2 |
    
    0 讨论(0)
提交回复
热议问题