2011-12-21 19 views
2

私は一日中不思議に思っています。多対多MySQLテーブルのカウントと複数グループ化

例として、newsシステムの単純なテストテーブルがあります。我々はnewstags、およびcategoriesを持っています。 Newsは、多くの場合、tagsと1つのcategoryを持つことができます。私が必要とするのは、tagの下にど​​れくらい多くのnewsが入っているかをそれぞれcategoryに数えることです。たとえば、政治カテゴリの一般タグと2 newsの科学カテゴリの一般タグ付きの4 newsを持つことができます。

私のテーブルには、次のようになります。ここでは

news: 
    - news_id 
    - category_id 
    - title 

categories: 
    - category_id 
    - category_name 

tags: 
    - tag_id 
    - tag_name 

news_tags: 
    - news_id 
    - tag_id 

は私が必要なものを明確にするシンプルなマインドマップである:ここでは enter image description here http://i.stack.imgur.com/6ySiJ.png

は私がいない成功を収めて試してみたクエリです:

SELECT *, COUNT(n.news_id) AS news_count FROM news AS n 
LEFT JOIN categories AS c ON n.category_id = c.category_id 
LEFT JOIN news_tags AS tn ON n.news_id = tn.news_id 
LEFT JOIN tags AS t ON tn.tag_id = t.tag_id 
GROUP BY t.tag_id, c.category_id; 

答えて

0

あなたのお問い合わせは私のために間違いなく動作します。 クエリを実行したときにどのようなエラーが発生するのですか/なぜ成功しませんでしたか?

これはあなたの状況設定する私の試みです:あなたがタグでカウントを集計しているので、それはSELECT *に意味がありません。しかし

+---------+-------------+------------------------+-------------+---------------+---------+--------+--------+----------+------------+ 
| news_id | category_ID | title     | category_id | category_name | news_id | tag_id | tag_id | tag_name | news_count | 
+---------+-------------+------------------------+-------------+---------------+---------+--------+--------+----------+------------+ 
|  1 |   1 | politics and general 1 |   1 | politics  |  1 |  1 |  1 | general |   4 | 
|  5 |   2 | science and general 1 |   2 | science  |  5 |  1 |  1 | general |   2 | 
|  7 |   2 | science and funny 1 |   2 | science  |  7 |  2 |  2 | funny |   1 | 
+---------+-------------+------------------------+-------------+---------------+---------+--------+--------+----------+------------+ 

:クエリの

mysql> select * from news; 
+---------+-------------+------------------------+ 
| news_id | category_ID | title     | 
+---------+-------------+------------------------+ 
|  1 |   1 | politics and general 1 | 
|  2 |   1 | politics and general 2 | 
|  3 |   1 | politics and general 3 | 
|  4 |   1 | politics and general 4 | 
|  5 |   2 | science and general 1 | 
|  6 |   2 | science and general 2 | 
|  7 |   2 | science and funny 1 | 
+---------+-------------+------------------------+ 

mysql> select * from tags; 
+--------+----------+ 
| tag_id | tag_name | 
+--------+----------+ 
|  1 | general | 
|  2 | funny | 
+--------+----------+ 

mysql> select * from news_tags; 
+---------+--------+ 
| news_id | tag_id | 
+---------+--------+ 
|  1 |  1 | 
|  2 |  1 | 
|  3 |  1 | 
|  4 |  1 | 
|  5 |  1 | 
|  6 |  1 | 
|  7 |  2 | 
+---------+--------+ 

mysql> select * from categories; 
+-------------+---------------+ 
| category_id | category_name | 
+-------------+---------------+ 
|   1 | politics  | 
|   2 | science  | 
+-------------+---------------+ 

の検索結果を/カテゴリとtitleのようなものは集約されても意味がありません。

あなたは試してみてください:

SELECT c.category_name, t.tag_name, COUNT(n.news_id) AS news_count FROM news AS n 
LEFT JOIN categories AS c ON n.category_id = c.category_id 
LEFT JOIN news_tags AS tn ON n.news_id = tn.news_id 
LEFT JOIN tags AS t ON tn.tag_id = t.tag_id 
GROUP BY t.tag_id, c.category_id; 

を取得するには:

+---------------+----------+------------+ 
| category_name | tag_name | news_count | 
+---------------+----------+------------+ 
| politics  | general |   4 | 
| science  | general |   2 | 
| science  | funny |   1 | 
+---------------+----------+------------+ 
+0

側の注意を:あなたが記事を書くとき、私はちょうどstackoverflowの編集ツールバーの 'ブロックquote'ブツをdiscovere ...私はちょうど永久に手動ですべての前面に4つのスペースを追加することを費やした!ああ! –

+0

まあ...私のクエリでは何のエラーも出ませんが、うまくいきますが、悪い結果を得ていると思いました。今私は実際に正しい結果が得られていることに気がついたが、すべてのデータを選択したため(テスト目的のみ)、私の目はこれを見たことがなく、何か悪いことを数えた。さて、これを申し訳なく思って、これを私に明らかにしてくれてありがとう。 –

関連する問題