【问题标题】:Currently using a query to order another query; can these be combined?当前使用一个查询来订购另一个查询;这些可以结合起来吗?
【发布时间】:2017-09-27 06:05:37
【问题描述】:

现在我有一个查询查询以便对其进行排序的表单。我知道可以按多个条件进行排序,但是当我尝试将第二个顺序条件添加到查询中时,它似乎没有做任何事情。

这是随机 LP Picker 查询。它让我从数百个列表中随机选择 10 个 LP:

SELECT TOP 10 Artists.OriginalName, LPs.Album, LPs.rating, LPs.[Notable 
Songs], LPs.Comments, [Listened (LPs)].last_date, [Listened 
(LPs)].times_listened, LPs.LPID
FROM (LPs INNER JOIN Artists ON LPs.Performer_id = Artists.ArtistID) INNER 
JOIN [Listened (LPs)] ON LPs.LPID = [Listened (LPs)].disc_id
WHERE (((LPs.Status)=1 Or (LPs.Status)=5) AND ((LPs.[Media Type])=1))
ORDER BY Rnd(Int(Now()*[LPID])-Now()*[LPID]);

在我的表单中,我按日期排序查询,如下所示:

SELECT [Random LP Picker].*
FROM [Random LP Picker]
ORDER BY [Random LP Picker].last_date;

我尝试将这两种排序都放在 Random LP Picker 查询中,所以它看起来像:

ORDER BY  Rnd(Int(Now()*[LPID])-Now()*[LPID]), [Listened (LPs)].last_date;

这样做不会给我按 last_date 排序的列表。我也尝试反转这两个排序项,但这会导致几个字段根本不出现,原因超出我的知识范围。

如果我可以在一个查询中完成所有这些操作将会很有用。有可能吗?

注意:有几个人说过,为什么不按日期订购。问题是,这个查询所做的是对所有条目进行随机排序,然后返回前 10 个。因此,如果我通过 Rnd(...) 部分删除订单,那么我将不再获得 10 个随机条目。如果有另一种方法可以在不使用 ORDER 的情况下获得 10 个随机条目,那么我很乐意这样做,但这是我知道的唯一方法。

【问题讨论】:

  • 我不确定 ms 访问,但一般而言,SQL 按照定义的谓词顺序排列,即从左到右。同样在其他 rdbms angines 中,您可以定义 ASC 或 DESC,例如按 DATE1 ASC、DATE2 DESC 排序。
  • 所有你想要的最终结果集都在last_date 上排序,因此为什么不在查询中只在[Listened (LPs)].last_date 上排序?
  • 如果我只在 last_date 之前订购,那么我如何获得 10 个随机条目?除了我正在做的事情之外,还有其他方法可以做到这一点吗?

标签: sql ms-access


【解决方案1】:

考虑将查询移动到派生表中(即FROM 中的子查询)并按外部查询排序:

SELECT main.* 
FROM
  (SELECT TOP 10 a.OriginalName, l.Album, l.rating, l.[Notable Songs], 
          l.Comments, p.last_date, p.times_listened, l.LPID
   FROM (LPs l INNER JOIN Artists a ON l.Performer_id = a.ArtistID) 
   INNER JOIN [Listened (LPs)] p ON l.LPID = p.disc_id
   WHERE ((l.Status IN (1,5)) AND (l.[Media Type]=1))
   ORDER BY Rnd(Int(Now()*l.[LPID])-Now()*l.[LPID])
  ) As main
ORDER BY main.last_date

【讨论】:

    【解决方案2】:

    由于您希望最终结果集在last_date 上排序,因此您的最后一个ORDER BY 应该在[Listened (LPs)].last_date 上。子查询应根据随机数返回 TOP 10 行。

    你可以试试换行 ORDER BY Rnd(Int(Now()*[LPID])-Now()*[LPID]), [Listened (LPs)].last_date;

    [Listened (LPs)].last_date;

    修改后的查询如下:

        SELECT Artists.OriginalName, LPs.Album, LPs.rating, LPs.[Notable 
        Songs], LPs.Comments, [Listened (LPs)].last_date, [Listened 
        (LPs)].times_listened, LPs.LPID
        FROM (LPs INNER JOIN Artists ON LPs.Performer_id = Artists.ArtistID) INNER 
        JOIN [Listened (LPs)] ON LPs.LPID = [Listened (LPs)].disc_id
        WHERE (((LPs.Status)=1 Or (LPs.Status)=5) AND ((LPs.[Media Type])=1)) 
        AND LPs.LPID IN (SELECT TOP 10 LPID FROM LPs ORDER BY Rnd(Int(Now()*[LPID])-Now()*[LPID]))
    ORDER BY [Listened (LPs)].last_date;
    

    【讨论】:

    • 但是我不会再得到 10 个随机条目了;我仍然需要那个。
    • @CharlesHerold 是的。我没有修改查询的其他部分。我已经编辑了更多细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2022-06-23
    • 1970-01-01
    • 2016-12-31
    • 2017-06-30
    • 2020-09-21
    相关资源
    最近更新 更多