0

多対多の関係を持つ3つのテーブルがあります。テーブルは単純です: ムービー、タグ、ムービータグ (以下の定義)。最も人気のあるタグをユーザーが確認できるようにしたいと考えています。作業クエリは次のとおりです。

SELECT tags.tag, COUNT( * ) AS c, tags.id
FROM tags
LEFT JOIN movietags ON tags.id = tagid
GROUP BY tags.id
ORDER BY c DESC 

結果は (tag name, count, tags.id) のようになります

action   450  2
comedy   300 10
drama    280  8
thriller 250  5
etc.

多くのムービーには、多くのタグが割り当てられています。ユーザーが好きなタグを選べるようにしてほしい。たとえば、ユーザーが上記のリストから「アクション」を選択した場合、「アクション」タグを持つ映画の中で最も人気のあるタグを取得する必要があります。結果は以下のようになります - 「アクション」タグが付いた映画のみ:

comedy   120 10
thriller  88  5
western   62 21
drama     41  8

今、エラーなしで WHERE 句を持つように上記のクエリを適応させることはできません。「アクション」カテゴリの映画のみを選択してカウントするにはどうすればよいですか? また、「アクション」、「スリラー」、「コメディ」のタグが付いた映画を、これらのタグが付いた映画の数で並べ替えるなど、より多くのタグからユーザーが選択できるようにしてほしいと思います。

テーブルの定義:

CREATE TABLE `movie` (
  `id` int(10) unsigned,
  `title` varchar(250),
  `tags` varchar(250),
  `category` varchar(250),
  KEY `id` (`id`)
) ENGINE=MyISAM;


CREATE TABLE `movietags` (
  `tagid` int(10) unsigned,
  `movieid` int(10) unsigned,
  UNIQUE KEY `tagid_2` (`tagid`,`movieid`),
  KEY `mainid` (`movieid`),
  KEY `tagid` (`tagid`)
) ENGINE=MyISAM;

CREATE TABLE `tags` (
  `id` int(10) unsigned auto_increment,
  `tag` varchar(250),
  PRIMARY KEY  (`id`),
  UNIQUE KEY `tag` (`tag`)
) ENGINE=MyISAM;
4

1 に答える 1

2

構文エラーに関しては、WHERE が GROUP BY の前に置かれています。

SELECT tags.tag, COUNT( * ) AS c, tags.id
FROM tags
LEFT JOIN movietags ON tags.id = tagid
WHERE tags.id =5
GROUP BY tags.id 
ORDER BY c DESC
于 2012-09-10T21:25:36.437 に答える