[英]MYSQL Grouping and Having Count
我有4个表:tblnames,tblcountry和tblcountry_link,tblgender。
tblcountry_link将名称和国家/地区表连接在一起,因为名称可以具有多个国家/地区。
tblnames:
名称ID | 姓名| GenderID
tblcountry
CountryID | 国家(地区)| 国籍
tblcountry_link
名称ID | CountryID
tblgender
GenderID | 性别
我想要一个国家列表以及每个国家或国籍的男女皆宜的名字,并选择一个起始字母-字母A;
我知道如何通过使用“名称”列上的“计数”和“具有”并按国籍分组来查找男女通用的名称列表。
{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
但是,我正在努力按国籍列出男女皆宜的名字。
我尝试将第一个示例中的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.