[英]Complex SQL query with JOIN and GROUP BY on 4 tables
這是我的表結構(簡化):
“視頻”表包含所有視頻的列表。
video
+----+-------+-------+
| id | title | views |
+----+-------+-------+
“頻道”表包含所有可能的頻道。 使用“ video_channel”表與“ video”有很多關系。
channel
+----+-------+
| id | title |
+----+-------+
video_channel
+----+----------+------------+
| id | video_id | channel_id |
+----+----------+------------+
“縮略圖”表為每個視頻包含幾個大拇指:
thumb
+----+------+----------+
| id | link | video_id |
+----+------+----------+
我需要得到的是:
+---------------+-----------------+-------------------------------------------+
| channel.title | number of video | first thumb of most viewed video for this |
| | per channel | channel |
+---------------+-----------------+-------------------------------------------+
我設法得到這個:
+---------------+-----------------+
| channel.title | number of video |
+---------------+-----------------+
使用此查詢:
SELECT channel.title, COUNT(*)
FROM video
INNER JOIN video_channel ON video_channel.video_id=video.id
INNER JOIN channel ON video_channel.channel_id=channel.id
GROUP BY video_channel.channel_id
ORDER BY COUNT(*) DESC
我使用MySql
似乎您需要一個相關的子查詢。
假設SQL Server是我的原始方言,則可以執行以下操作:
select
channel.title,
count(video_channel.video_id),
_mostViewedThumb.link
from
video_channel -- count
inner join channel on -- title
video_channel.channel_id = channel.id
cross apply ( -- most viewed
select top 1
thumb.link
from
thumb
inner join video on -- for order
thumb.video_id = video.id
where
video_channel.video_id = thumb.video_id
order by
video.views desc
) as _mostViewedThumb
group by
channel.title;
查詢以獲取頻道中觀看次數最多的視頻的縮略圖看起來像這樣,對吧?
SELECT thumb.link FROM channel
INNER JOIN video ON channel.id = video.channel_id
INNER JOIN thumb ON video.id = thumb.video_id
ORDER BY video.views DESC
LIMIT 1
在我看來,最簡單的方法是使用子查詢,因此,如果將查詢與上面的查詢一起加入,則可能會得到所需的答案:
SELECT channel.title, COUNT(*),
(SELECT thumb.link FROM channel1
INNER JOIN video1 ON channel1.id = video1.channel_id
INNER JOIN thumb ON video1.id = thumb.video_id
WHERE video1.id = video.id
ORDER BY video1.views DESC
LIMIT 1) AS thumb.link
FROM video
INNER JOIN video_channel ON video_channel.video_id=video.id
INNER JOIN channel ON video_channel.channel_id=channel.id
GROUP BY video_channel.channel_id
ORDER BY COUNT(*) DESC
但是我承認,通常需要花些時間來使子查詢語法正確。 第一次嘗試我很少得到它。
謝謝你們,我最終通過這個查詢設法得到了我想要的東西:
SELECT c.title, COUNT(*),
(
SELECT thumb.link
FROM video
INNER JOIN video_channel ON video_channel.video_id=video.id
INNER JOIN thumb ON thumb.video_id=video_channel.video_id
INNER JOIN channel ON channel.id=video_channel.channel_id
WHERE video_channel.channel_id=c.id
ORDER BY video.views DESC, thumb.id ASC
LIMIT 1
) AS thumb_link
FROM channel c
INNER JOIN video_channel ON video_channel.channel_id=c.id
INNER JOIN video ON video.id=video_channel.video_id
GROUP BY video_channel.channel_id
ORDER BY COUNT(*) DESC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.