【问题标题】:select data from mysql views从 mysql 视图中选择数据
【发布时间】:2017-11-13 05:38:04
【问题描述】:

我有 2 个表 订阅频道 和频道视频。 我想要实现的是。从订阅频道中选择最多 5 个频道,然后每个频道最多选择 4 个视频。 频道的位置需要按其最近上传的视频时间排序。下面的例子。

  • 频道 1 – 上次上传的视频是 5 天前。
  • 频道 2 – 最后一个视频是 3 天前上传的。
  • 第 3 频道 – 上一个视频是 1 小时前上传的。

这些频道在 subscribed-channels.php 页面中的位置如下:

  • 位置 1(顶部)– 通道 3
  • 位置 2 – 通道 2
  • 位置 3 – 通道 1。

请指导我如何编写此查询。 我尝试了什么:

SELECT
  usersubscriptions.*,
  uservideos.videoId,uservideos.videoThumbnail
FROM
  usersubscriptions
JOIN
  uservideos ON usersubscriptions.subscribedTo = uservideos.userId
ORDER BY
  uservideos.videoTime DESC,
  usersubscriptions.subscribedTo

我创建了连接,但我无法限制数据或对其进行排序。

【问题讨论】:

  • 你尝试过什么?请分享您的代码。
  • @ravisachaniya 请检查更新后的问题。我尝试加入表格并按时间排序。

标签: php mysql join


【解决方案1】:

您正在寻求“每个类别前 n 个”(每个频道前 4 个)解决方案。这比它可能更难,因为 MySQL(如当前的 v5.7)通常缺乏窗口函数,特别是row_number()。然而,有一种解决方法使用变量来模仿 row_number()

SELECT
       *
FROM (
      SELECT
            usersubscriptions.*
          , uservideos.videoId
          , uservideos.videoTime
          , uservideos.videoThumbnail
          , @rn := IF(@prev = usersubscriptions.subscribedTo, @rn + 1, 1) AS rn
          , @prev := usersubscriptions.subscribedTo
      FROM usersubscriptions
      JOIN uservideos ON usersubscriptions.subscribedTo = uservideos.userId
      CROSS JOIN (SELECT @prev := NULL, @rn := 0) AS vars
      ORDER BY
            usersubscriptions.subscribedTo
          , uservideos.videoTime DESC
      ) d
WHERE rn <= 4
ORDER BY
      d.videoTime DESC
    , d.subscribedTo
LIMIT 20
;

【讨论】:

  • order by 子句给出错误 videoTime 和 subscribedTo clumns are not Recognized
  • 我可以从 php.ini 调用这个查询吗? ??
  • 你能告诉我如何将其转换为视图,因为当前它给了我错误,因为视图不能有变量
  • videoTime 我注意到您的查询中缺少该列对于我的原始帖子来说太晚了,不久前添加了它。在我做那个编辑之前,你一定已经抓住了山雀。如果缺少另一列,请不要怪我,因为该表中的每一列都可用 usersubscriptions.*
  • 您将无法将其设为视图。为什么你不能从 php 调用它?请注意在形成查询字符串时保留查询。像任何其他查询一样。
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 2023-03-11
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多