繁体   English   中英

MYSQL分组和计数

[英]MYSQL Grouping and Having Count

我有4个表:tblnames,tblcountry和tblcountry_link,tblgender。

tblcountry_link将名称和国家/地区表连接在一起,因为名称可以具有多个国家/地区。

tblnames:

名称ID | 姓名| GenderID

  1. 亚瑟2
  2. 爱美1
  3. 奥布里1
  4. 奥布里2

tblcountry

CountryID | 国家(地区)| 国籍

  1. 阿富汗阿富汗
  2. 阿根廷阿根廷人

tblcountry_link

名称ID | CountryID

  1. 1 | 1
  2. 1 | 2
  3. 2 | 1

tblgender

GenderID | 性别

  1. 1 |
  2. 2 |

我想要一个国家列表以及每个国家或国籍的男女皆宜的名字,并选择一个起始字母-字母A;

  1. 阿富汗(3)
  2. 阿根廷(5)...

我知道如何通过使用“名称”列上的“计数”和“具有”并按国籍分组来查找男女通用的名称列表。

    {SELECT co.Nationality, COUNT( * ) 
    FROM (
    SELECT n.Name, COUNT( n.Name ) AS Countname, SUBSTR( Name, 1, 1 ) AS firstletter, g.Gender, cl.CountryID, c.Country, c.Nationality
    FROM tblnames AS n
    INNER JOIN tblgender AS g ON n.GenderID = g.GenderID
    INNER JOIN tblcountry_link AS cl ON cl.NameID = n.NameID
    INNER JOIN tblcountry AS c ON cl.CountryID = c.CountryID
    WHERE n.name LIKE CONCAT(  'A',  '%' ) 
    AND c.Nationality =  'Afghan'
    GROUP BY n.Name
    HAVING Countname >1
    ) AS co

这给了我阿富汗(3)

但是,如果我删除Where子句的阿富汗部分,则结果不正确。 我尝试对该查询进行各种调整以获取所需的内容,但结果始终看起来不正确。

我还可以获取男女的每个国家或国籍(如果在“ Where”子句中添加,则可以是男性或女性)。

    {SELECT cl.CountryID, c.Country, COUNT( n.Name ) AS Countname
    FROM tblnames AS n
    INNER JOIN tblcountry_link AS cl ON cl.NameID = n.NameID
    INNER JOIN tblcountry AS c ON cl.CountryID = c.CountryID
    WHERE n.name LIKE CONCAT( 'A', '%' ) 
    GROUP BY c.Country}

CountryID | 国家(地区)| Countname

  1. AF | 阿富汗| 624
  2. AR | 阿根廷| 28
  3. AM | 亚美尼亚| 5 ...

但是,我正在努力按国籍列出男女皆宜的名字。

我尝试将第一个示例中的Haveing子句与后者结合起来,但这不起作用。 我尝试加入2个男查询和女查询中的两个子查询,其中名称匹配,但是我无法正确地对它们进行分组和计数。 我也尝试了使用第一个示例的派生表,但我只能使用1列,而该列为2。

任何帮助表示赞赏。

尝试这个。 让我知道它是否有效。

SELECT M.Country, MaleCount, FemaleCount FROM 
(SELECT c.country, COUNT( n.Name ) AS MaleCount
    FROM tblnames AS n
    INNER JOIN tblcountry_link AS cl ON cl.NameID = n.NameID
    INNER JOIN tblcountry AS c ON cl.CountryID = c.CountryID
    WHERE n.name LIKE 'A%'
    AND GenderID = 2
    GROUP BY c.Country) AS M,
(SELECT c.country, COUNT( n.Name ) AS FemaleCount
        FROM tblnames AS n
        INNER JOIN tblcountry_link AS cl ON cl.NameID = n.NameID
        INNER JOIN tblcountry AS c ON cl.CountryID = c.CountryID
        WHERE n.name LIKE 'A%'
        AND GenderID = 1
        GROUP BY c.Country) AS F  
WHERE M.country = F.country

如果我做对了,您应该在国家/地区,男性数量和女性数量(以名字开头的A)开头得到结果集。可能有更好的方法。 如果我想一种更好的方法,我将进行编辑。

我还有一个使用派生表的方法。 我读了这篇文章 它是TSQL,但适用相同的结构。 我想我已经在下面找到了解决方案。

    SELECT a1.Country, COUNT(a1.Name) as NameCount FROM (
    SELECT cl.CountryID, c.Country, n.Name, COUNT( n.Name ) AS Countname
    FROM tblnames AS n
    INNER JOIN tblgender AS g ON n.GenderID = g.GenderID
    INNER JOIN tblcountry_link AS cl ON cl.NameID = n.NameID
    INNER JOIN tblcountry AS c ON cl.CountryID = c.CountryID
    WHERE n.name LIKE CONCAT( 'A', '%' ) 
    GROUP BY c.Nationality, n.Name
    HAVING Countname >1
    ORDER BY n.Name) as a1
    Group BY a1.Country

这给了我结果:

国家(地区)| NameCount

  1. 阿富汗| 3
  2. 奥地利| 2
  3. 中国| 1 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM