Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql使用特定属性计算行数_Mysql_Select_Count_Distinct - Fatal编程技术网

Mysql使用特定属性计算行数

Mysql使用特定属性计算行数,mysql,select,count,distinct,Mysql,Select,Count,Distinct,这是我的桌子: Id | name | Store 001 | John | A 001 | John | A 001 | John | A 001 | John | B 001 | John | B 001 | John | D 002 | Bob | B 002 | Bob | C 003 | Dave | C 004 | Pamela | A 004 | Pamela | B 004 | Pamela | C 005 | Nick |

这是我的桌子:

Id  | name | Store   
001 | John | A   
001 | John | A     
001 | John | A       
001 | John | B
001 | John | B 
001 | John | D
002 | Bob  | B 
002 | Bob  | C 
003 | Dave | C 
004 | Pamela | A
004 | Pamela | B
004 | Pamela | C 
005 | Nick   | D
005 | Nick   | D
005 | Nick   | D
  • 那么,我如何选择并统计所有在A和B购物的人
  • 只有A和B
  • A或B,但没有其他
  • 只有D吗
    在我的例子中,预期结果是:(1)John+Pamela,(2)John,(3)John(4)Nick

    在A和B(可能在其他地方)购物的人的姓名:

    在A或B(但无其他)具有以下特征的人员姓名:

    仅在A和B购物的人员姓名:

    SELECT name
    FROM yourTable
    GROUP BY name
    HAVING SUM(CASE WHEN Store = 'A' THEN 1 END) > 0 AND   -- A is present
           SUM(CASE WHEN Store = 'B' THEN 1 END) > 0 AND   -- B is present
           COUNT(DISTINCT Store) = 2                       -- only A and B are present
    
    仅在D店购物的人员姓名:

    SELECT name
    FROM yourTable
    GROUP BY name
    HAVING SUM(CASE WHEN Store <> 'D' THEN 1 END) = 0      -- only store D
    
    选择名称
    从你的桌子上
    按名称分组
    具有总和(当存储“D”然后为1结束时的情况)=0——仅存储D
    
    此处演示第二次查询:


    我喜欢使用
    分组方式和
    拥有方式来处理这些查询:

    select name
    from t
    group by name
    having sum(store = 'A') > 0 and
           sum(store = 'B') > 0;
    
    这让在两家商店都购物过的人受益匪浅。如果您只想要这两家商店,而不想要其他商店:

    select name
    from t
    group by name
    having sum(store = 'A') > 0 and
           sum(store = 'B') > 0 and
           sum(store not in ('A', 'B')) = 0;
    

    蒂姆和戈登回答得很好。对于一个新的案例(3)a或B,但没有其他案例如何?我已经更新了我的问题,以涵盖更多的案例。只在D点怎么样?
    select name
    from t
    group by name
    having sum(store = 'A') > 0 and
           sum(store = 'B') > 0;
    
    select name
    from t
    group by name
    having sum(store = 'A') > 0 and
           sum(store = 'B') > 0 and
           sum(store not in ('A', 'B')) = 0;