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

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

tblnames:

名称ID |姓名|性别编号


亚瑟2
爱美1
奥布里1
奥布里2


小国

CountryID |国家(地区)|国籍


阿富汗阿富汗
阿根廷阿根廷人


tblcountry_link

名称ID |国家ID


1 | 1个
1 | 2
2 | 1个


性别

GenderID |性别


1 |女
2 |男


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


阿富汗(3)
阿根廷(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 |国家(地区)|数名


AF |阿富汗| 624
AR |阿根廷| 28
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


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

关于mysql - MYSQL分组和计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43758386/

10-11 06:49
查看更多