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

麦肯

视频表存储ID和视频数据。

标签表存储id和tag_name。

video_tag表连接video_id和tag_id,以表示哪个视频属于哪个标签。

例如,在下面的查询中,我可以获取属于ID3和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 

*

表结构:

   --
    -- Table structure for table `video`
    --

    CREATE TABLE IF NOT EXISTS `video` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `original_id` varchar(20) COLLATE utf8_turkish_ci NOT NULL COMMENT 'alınan sitedeki id''si',
      `source` tinyint(2) NOT NULL,
      `title` varchar(160) COLLATE utf8_turkish_ci NOT NULL,
      `link` varchar(250) COLLATE utf8_turkish_ci NOT NULL,
      `image` varchar(300) COLLATE utf8_turkish_ci NOT NULL,
      `seconds` smallint(6) NOT NULL,
      `fullscreen` varchar(100) COLLATE utf8_turkish_ci NOT NULL,
      PRIMARY KEY (`id`),
      KEY `source` (`source`,`seconds`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=122987 ;

--
-- Table structure for table `tag`
--

CREATE TABLE IF NOT EXISTS `tag` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tag_name` varchar(24) COLLATE utf8_turkish_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `tag_name` (`tag_name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=191 ;
--
-- Table structure for table `video_tag`
--

CREATE TABLE IF NOT EXISTS `video_tag` (
  `video_id` int(11) NOT NULL,
  `tag_id` int(11) NOT NULL,
  KEY `video_id` (`video_id`,`tag_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
戈登·利诺夫(Gordon Linoff)

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

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 ;

只有当视频可以具有相同类型的重复标签时,这才行不通。在这种情况下,您可以改为使用COUNT(DISTINCT)

如果要返回带有分页的行数的查询,请使用SQL_CALC_FOUND_ROWS

SELECT SQL_CALC_FOUND_ROWS v.*
. . .

然后使用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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有2个联接和计数的SQL查询

来自分类Dev

具有单个表的内部联接的SQL计数

来自分类Dev

MySQL慢速查询具有2个内部联接

来自分类Dev

MySQL慢速查询具有2个内部联接

来自分类Dev

具有多个内部联接的SQL查询返回错误的值计数

来自分类Dev

具有内部联接的SQL max()

来自分类Dev

具有内部联接的SQL子查询

来自分类Dev

具有内部联接的SQL max()

来自分类Dev

具有两个总和和三个表的内部联接的SQL语句

来自分类Dev

SQL:联接具有计数,加法和更多限制的3个表

来自分类Dev

具有3个表和2个和组的内部联接

来自分类Dev

SQL:比较2个具有特定值的字段的计数

来自分类Dev

具有内部联接的DISTINCT SQL查询从考虑因素中省略了一个列,

来自分类Dev

具有2个内部联接的PHP PDO。如何在php中区分它们

来自分类Dev

具有2个内部联接的PHP PDO。如何在php中区分它们

来自分类Dev

具有左外部联接的X的SQL增量计数

来自分类Dev

具有计数和联接的SQL查询中的动态列

来自分类Dev

具有相同表的两个内部联接

来自分类Dev

具有两个内部联接的PostgreSQL查询

来自分类Dev

具有两个表的内部联接查询

来自分类Dev

构造具有许多内部联接的SQL查询的最佳方法?

来自分类Dev

具有内部联接和条件的SQL sum函数

来自分类Dev

Access-SQL:具有多个表的内部联接

来自分类Dev

具有内部联接优化的SQL更新查询

来自分类Dev

使用内部联接时具有不同值的SQL查询

来自分类Dev

SQL查询-具有内部联接的不同数据库

来自分类Dev

构造具有许多内部联接的SQL查询的最佳方法?

来自分类Dev

具有count()条件和关系代数的SQL内部联接

来自分类Dev

使用内部联接时具有不同值的SQL查询

Related 相关文章

热门标签

归档