Mysql 具有2个内部联接的SQL计数

Mysql 具有2个内部联接的SQL计数,mysql,sql,Mysql,Sql,视频表存储id和视频数据 标记表存储id和标记名称 video_tag table连接video_ID和tag_ID以表示哪个视频属于哪个标记 例如,在下面的查询中,我可以得到属于ID为3和4的标签的视频 还有,我想知道有多少行。我应该如何修改查询 SELECT * FROM video INNER JOIN video_tag ON video.id = video_tag.video_id INNER JOIN tag

视频表存储id和视频数据

标记表存储id和标记名称

video_tag table连接video_ID和tag_ID以表示哪个视频属于哪个标记

例如,在下面的查询中,我可以得到属于ID为3和4的标签的视频

还有,我想知道有多少行。我应该如何修改查询

SELECT *
            FROM video
            INNER JOIN video_tag ON video.id = video_tag.video_id
            INNER JOIN tag ON tag.id = video_tag.tag_id
            WHERE video_tag.tag_id IN (3,4)
            GROUP BY video.id
            HAVING COUNT(video.id)=2
            ORDER BY video.id DESC 
*

表结构:


这是完整的查询。它将向您显示每一个视频,以及它的总数。希望能有帮助

SELECT v.id, COUNT(v.id) as [Number]
        FROM video AS v -- using alias
        INNER JOIN video_tag vt ON v.id = vt.video_id
        INNER JOIN tag t ON t.id = vt.tag_id
        WHERE vt.tag_id IN (3,4) -- this is optional; you can remove it
        GROUP BY v.id

欢迎进一步询问。

视频表中的视频总数-

SELECT count(*) FROM video;
其他关系表中也存在的行的总数-

SELECT COUNT(*) 
            FROM video 
            INNER JOIN video_tag ON video.id = video_tag.video_id 
            INNER JOIN tag ON tag.id = video_tag.tag_id 
仅标记_id 3和4的总行数

SELECT COUNT(*) 
            FROM video 
            INNER JOIN video_tag ON video.id = video_tag.video_id 
            INNER JOIN tag ON tag.id = video_tag.tag_id 
            WHERE video_tag.tag_id IN (3,4)
SELECT COUNT(distinct video.id) 
            FROM video 
            INNER JOIN video_tag ON video.id = video_tag.video_id 
            INNER JOIN tag ON tag.id = video_tag.tag_id 
            WHERE video_tag.tag_id IN (3,4)
标签标识3和4的总唯一视频标识

SELECT COUNT(*) 
            FROM video 
            INNER JOIN video_tag ON video.id = video_tag.video_id 
            INNER JOIN tag ON tag.id = video_tag.tag_id 
            WHERE video_tag.tag_id IN (3,4)
SELECT COUNT(distinct video.id) 
            FROM video 
            INNER JOIN video_tag ON video.id = video_tag.video_id 
            INNER JOIN tag ON tag.id = video_tag.tag_id 
            WHERE video_tag.tag_id IN (3,4)

您的查询应该是您想要的。但是,您可以简化它:

SELECT v.*
FROM video v INNER JOIN
     video_tag vt
     ON v.id = vt.video_id
WHERE vt.tag_id IN (3, 4)
GROUP BY v.id
HAVING COUNT(v.id) = 2
ORDER BY v.id DESC ;
唯一不起作用的时候是视频可能有相同类型的重复标签。在这种情况下,您可以改为使用COUNTDISTINCT

如果要返回包含分页的行数的查询,请使用SQL_CALC_FOUND_rows:

然后使用找到的行

如果只需要行数,可以使用子查询,并进一步简化:

SELECT COUNT(*)
FROM (SELECT v.*
      FROM video_tag vt
      WHERE vt.tag_id IN (3, 4)
      GROUP BY vt.id
      HAVING COUNT(*) = 2
     ) t

你想知道视频总数吗?我想你的查询已经提供了总行数和详细信息…如果你只想计数,那么你可以使用select count*from并从查询中删除order by子句…如果你想要一些特殊的东西,那么解释一下…@ZafarMalik我想知道有多少行。如果a just put select count*它只给我2个,其中包含count video.id=3@aadi对我只想要视频的总数。可以给我一个工作查询吗?因为很明显,必须有一个计数,但在哪里呢?我已尝试过,但出现了一个简单的列名“id”错误。选择COUNT*FROM SELECT*FROM video internal JOIN video_tag ON video.id=video_tag.video_id internal JOIN tag ON tag.id=video_tag.tag_id其中video_tag.tag_id IN 3,4,5 GROUP BY video.id具有COUNTvideo.id=3作为TDo注意“alias”的使用,因为它提供了很多方便您不必编写完整的表名。