2017-05-03 12 views
0

私は4つのテーブルを持っています:tblnames、tblcountryとtblcountry_link、tblgender。MYSQLグループ化とカウント数

名前が複数の国を持つことができるように、tblcountry_linkは名前と国の表を結合します。

tblnames:

NameID |名前| GenderID

  1. アーサー2
  2. エイミー1
  3. オーブリー1
  4. オーブリー2

tblcountry

CountryID |カントリー|国籍

  1. アフガニスタンアフガン
  2. アルゼンチンアルゼンチン

tblcountry_link

名前ID |国ID

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

tblgender

GenderID |性別

  1. 1 |女性
  2. 2 |男性

各国または国籍のUnisexの名前のリストを希望します。これは、自分の選択した開始文字を使用します。

  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} 

国ID |カントリー|カウント名

  1. AF |アフガニスタン| 624
  2. AR |アルゼンチン| 28
  3. AM |アルメニア| 5 ...

しかし、私は国籍別にユニセックス名の数をリストするのに苦労しています。

最初の例でHaving句を後者に組み合わせようとしましたが、これは機能しません。 名前が一致する男性と女性の2つのサブクエリに参加しようとしましたが、グループ化して正しくカウントできませんでした。 第1の例を使用して派生テーブルを試しましたが、1列しか使用できません。これは2です。

答えて

0

これを試してください。それが動作するかどうか私に教えてください。

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.で始まり、女性の数の数を持っている必要があります。私はもっ​​と良い方法を考えれば編集します。

+0

これは機能しますが、私が望むものではありません。私はカウントの列が男性と女性の両方である名前を数えるために必要です - したがってユニセックス - 国別にグループ化されています。 – thunderousity

+0

私は今それを得ると思います。私は数時間で私の記事を解決するつもりです。まだ投稿されていない場合。 – noyanc

0

派生テーブルを使用して別の作業を行っていました。私はこのarticleを読んだ。それは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 ...
+0

ニース。私は同じことを考えていた。申し訳ありませんが私はあなたの質問を最初に理解しています。私がおそらく変えることの1つは、concat関数です。私は連結の代わりに 'A%'としてそれを行うだろう。 – noyanc

関連する問題