具有不同的复杂 MySQL 查询

Posted

技术标签:

【中文标题】具有不同的复杂 MySQL 查询【英文标题】:Complicated MySQL Query with distinct 【发布时间】:2011-03-29 19:40:25 【问题描述】:

这是我从“实际上它是两个不同表的视图”中获取数据的表

第一个表是用户表,其中包含有关用户的所有信息。

第二个是日志表,记录观看视频的人以及观看时间。

log_views.id,
log_views.user_id,
log_views.video_id,
log_views.date,
users.user_key,
users.name_display,
users.img_key

我想要显示最后 18 个用户来观看视频,但我不想要任何重复的用户。因此,如果一个用户在过去 18 年中出现了两次,我只想要他的最新视图,然后跳过所有其他视图。

我尝试使用 DISTINCT 关键字,但我得到的列不止一列,所以它不起作用。

【问题讨论】:

【参考方案1】:

看看这些以获得一些指示:

mysql Group By with top N number of each kind

http://explainextended.com/2009/03/06/advanced-row-sampling/

【讨论】:

【参考方案2】:

这是一个有效的查询。它假定您只需要给定视频 ID (@video_id) 的日志:

SELECT log_date, user_id, name_display
FROM (
  SELECT MAX(l.date) AS log_date, user_id
  FROM log_views AS l
  WHERE (l.video_id=@video_id)
  GROUP BY user_id
  ORDER BY log_date DESC
  LIMIT 18
) AS top
INNER JOIN users AS u ON (u.user_key=top.user_id)

【讨论】:

【参考方案3】:

这就是我最终使用的。 recent_video_viewers 是我创建的视图的名称,所以我不必进行任何连接

SELECT id, MAX(date), user_id, img_key, random_key 
FROM recent_video_viewers 
WHERE video_id = '$vr[id]' AND img_key != '' 
GROUP BY user_id 
ORDER BY MAX(date) DESC 
LIMIT 18

我不确定这是否是最好的方法,但它确实有效。

【讨论】:

以上是关于具有不同的复杂 MySQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

具有复杂查询匹配模式的 MySQL 与 PostgreSQL 性能

mysql复杂查询

MySQL复杂子查询公式

在 MySQL 中实现一个复杂的查询

具有 2 个外键的复杂 MySQL 选择

MySQL复杂查询