我有3個表:左連接子選擇與限制MySQL的
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種最常見的(最高clip_count
)以及最近更新的每個(最新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`
的問題是左連接的子查詢只計算一次,併爲每一個結果集合中的標籤是從5個標籤的池只牽強。
預計GROUP_CONCAT
'd標籤標題爲基努·裏維斯結果:
comedy, scifi, action, suspense, western
(西方和紀錄片有2 clip_count
,但western
應該是第一位的,因爲它有一個後update_timestamp
)
我我不確定這是否具有任何相關性,但是我正在執行actors表上的其他連接,但是在此問題中刪除了它們。 這將是非常可取的,使這全1查詢,但我很難在如何做到這一點,即使有2個查詢。 1或2查詢解決方案表示讚賞。
1查詢少做?做更多?? .. http://sqlfiddle.com/#!2/279a21/10你將殺死MySQL性能與這個查詢在有很多記錄的大型表上。創建tmp表和複製到tmp表需要最長的時間時間... –
問題是你可以像這樣使用GROUP_CONCAT進行ORDER BY。 GROUP_CONCAT(t.title ORDER BY t.title),但只有列出的記錄.. –
@RaymondNijland我欣賞表現免責聲明,但我對可能性/解決方案因素感興趣。我打開2個查詢,但我會等待看看別人有什麼要說的。 – danronmoon