私は3つのテーブルを持っています:
actor
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
|----------|------------------|------|-----|---------|----------------|
| actor_id | int(10) unsigned | NO | PRI | (null) | auto_increment |
| username | varchar(30) | NO | | (null) | |
tag
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
|--------|------------------|------|-----|---------|----------------|
| tag_id | int(10) unsigned | NO | PRI | (null) | auto_increment |
| title | varchar(40) | NO | | (null) | |
actor_tag_count
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
|------------------|------------------|------|-----|-------------------|-----------------------------|
| actor_id | int(10) unsigned | NO | PRI | (null) | |
| tag_id | int(10) unsigned | NO | PRI | (null) | |
| clip_count | int(10) unsigned | NO | | (null) | |
| update_timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
各アクター の 5 つの最も頻繁な (highest ) タグとclip_count
最近更新された (latest ) タグを取得したいと考えています。update_timestamp
私の試みたクエリは次のとおりです。
SELECT
`a`.`actor_id`,
`a`.`username`,
GROUP_CONCAT(atc.clip_count) AS `tag_clip_counts`,
GROUP_CONCAT(t.tag_id) AS `tag_ids`,
GROUP_CONCAT(t.title) AS `tag_titles`
FROM
`actor` AS `a`
LEFT JOIN (
SELECT
`atc`.`actor_id`,
`atc`.`tag_id`,
`atc`.`clip_count`
FROM
`actor_tag_count` AS `atc`
INNER JOIN `actor` AS `a` USING (actor_id)
ORDER BY
atc.clip_count DESC,
atc.update_timestamp DESC
LIMIT 5
) AS `atc` USING (actor_id)
LEFT JOIN `tag` AS `t` ON atc.tag_id = t.tag_id
GROUP BY
`a`.`actor_id`
問題は、左側の結合副選択が 1 回だけ計算され、セット内のすべての結果のタグが 5 つのタグのプールからのみフェッチされることです。
GROUP_CONCAT
キアヌ・リーブスの予想されるタグタイトルの結果:
comedy, scifi, action, suspense, western
(西部劇もドキュメンタリーもclip_count
2 の がwestern
ありますが、後の があるので最初に来る必要がありますupdate_timestamp
)
これが関連性のあるポイントであるかどうかはわかりませんが、アクターテーブルで他の結合を実行していますが、この質問のためにそれらを削除しました. これをすべて1つのクエリにすることが非常に望ましいですが、2つのクエリでもこれを行う方法に困惑しています。1 つまたは 2 つのクエリ ソリューションを歓迎します。