簡體   English   中英

在4個表上使用JOIN和GROUP BY進行復雜的SQL查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM