这个查询可以吗?

Posted

技术标签:

【中文标题】这个查询可以吗?【英文标题】:Is this query possible? 【发布时间】:2011-06-28 10:54:01 【问题描述】:

我有一个视频网站,其中每个视频都属于一个类别,我想显示每个类别中观看次数最多的视频。

视频点击有自己的表格,每个点击记录 user_id 和 video_id

我正在努力计算点击次数,如果单个用户观看视频十次,它仍然只计算一次点击次数。

谢谢。

【问题讨论】:

【参考方案1】:

你的意思是这样的

SELECT COUNT(DISTINCT(user_id))
FROM video_hits
WHERE video_id = '1826'

它应该给出观看 id 为 1826 视频的用户总数

编辑:我只在 MS SQL 中对此进行了测试,因为我现在正在工作 - 我回家后可以在 mysql 中检查它,但我认为它是相同的。

【讨论】:

【参考方案2】:

如果一个用户观看一个视频十次,它仍然只计算一次点击。

使用 COUNT(DISTINCT user_id)

我正在苦苦挣扎的部分......

这是否意味着您已经解决了从每个类别中获取热门视频的问题?这是 SQL 中一个更复杂的问题 (the max-concat trick)

【讨论】:

认为 我已经对其余部分进行了排序,它包括我没有提到的其他一些表:- SELECT COUNT(DISTINCT views.user_id) as hits, categories.name as cat_name,categories.url 作为 cat_url,videos.id 作为 video_id,videos.title 作为标题,videos.file_still 作为图像,users.username 作为昵称,series.url 作为 series_url FROM categories 在 vi​​deos.category_id = 类别中加入视频。 id JOIN users ON videos.user_id = users.id JOIN views ON videos.id = views.video_id JOIN series ON videos.series_id = series.id GROUP BY categories.id ORDER BY categories.name,点击 DESC LIMIT 6【参考方案3】:

听起来您正在阻止命中表插入重复记录?您应该这样做,以便您可以执行 select count(id) where user_id = ??和 video_id = ??。这将返回这两个参数在表中出现的次数。

【讨论】:

因此,我首先应该只在表格中找到唯一的结果,而不是搜索唯一的结果。我有这个想法,但不想走那条路……谢谢。 不用担心,我的想法要么是我建议的,要么是添加一个新列,每次用户观看视频时,检查他们以前是否看过,如果是,则增加观看次数,如果没有创建新纪录?

以上是关于这个查询可以吗?的主要内容,如果未能解决你的问题,请参考以下文章

在这个查询中可以避免子查询吗?

这个 MySQL 连接查询可以优化吗?

这个查询可以进一步优化吗?即使在较差的硬件上也可以使其快速运行吗?

这个查询可以吗?

这个 SQLite 查询可以更快吗?

我可以以某种方式改进这个 linq 查询吗?