【问题标题】:How to combine SELECT SQL subquerys with RAND?如何将 SELECT SQL 子查询与 RAND 结合使用?
【发布时间】:2012-07-31 17:14:07
【问题描述】:

您好,我正在尝试将一些查询合并为一个,但我不确定如何解决这个问题。我知道还有数百万其他示例,但我不知道如何将它们翻译成我的查询。

这是数据库。首先是表名:,然后是主键和外键

gallery:
    galleryID
    name
    addedDate

concert:
    concertID
    galleryID
    name
    URL
    addedDate

photo:
    photoID
    concertID
    name

这是我的查询,它在随机情况下在 URL 上返回 NULL。我猜这是因为应该同时选择 ConcertID 和 URL。但是不允许有SELECT concertID, URL FROM concert WHERE galleryID = g.galleryID ORDER BY RAND() LIMIT 1 那我该如何解决呢?

我在第一个查询中选择的内容是正确的,除了在 URL 上获取 NULL。所以我需要选择的是galleryID和addedDate FROM gallery(每行1个galleryID不是8个相同),concertID和来自音乐会的URL(1个具有相同concertID的随机帖子),来自照片的名称(1个具有相同concertID的随机帖子)。给我这些结果:

11  2012-07-31 15:44:35 90  Picture\Path11  SomePicture28.jpg
36  2012-07-31 14:31:36 208 Picture\Path36  SomePicture11.jpg
09  2012-07-30 15:28:02 33  Picture\Path09  SomePicture69.jpg

SELECT galleryID, addedDate, 
    (SELECT concertID 
        FROM concert 
            WHERE galleryID = g.galleryID 
    ORDER BY RAND() LIMIT 1) AS curID, 
    (SELECT URL 
        FROM concert 
            WHERE concertID = curID) AS URL, 
    (SELECT p.name 
            FROM photo p, concert c 
                WHERE p.concertID = curID AND c.galleryID = g.galleryID 
     ORDER BY RAND() LIMIT 1) AS photoName 
FROM gallery g ORDER BY addedDate DESC LIMIT 8;

我也尝试使用 JOIN 来执行此操作,但出现此错误 #1054 - Unknown column 'p.concertID' in 'where clause'

SELECT galleryID, addedDate, c.concertID, c.URL, p.name 
    FROM (SELECT concertID, URL, 
            (SELECT name 
                FROM photo 
                    WHERE p.concertID = curID.concertID 
             ORDER BY RAND() LIMIT 1) AS photoName 
             FROM concert 
                WHERE c.galleryID = curID.galleryID 
          ORDER BY RAND() LIMIT 1) curID 
LEFT JOIN concert c ON curID.galleryID = c.galleryID 
LEFT JOIN photo p ON p.name = curID.photoName 
ORDER BY addedDate DESC LIMIT 8;

【问题讨论】:

  • 你有没有网址为空的音乐会?当你得到一个空 url 时,尝试为那个音乐会 id 'select * from concert' 只是为了检查它不为空。
  • 我假设您从语法中使用 mysql。这是真的吗?
  • 不,URL 没有 NULL。我认为这是因为运行 similtanius 的 2 个子查询中的 curID 不匹配。是的,我正在使用 mysql。

标签: sql select join random subquery


【解决方案1】:

我在您的 SQL 中看不到任何原因为什么您的 URL 为空,它们是否都有值。

我已经用另一种格式重做了你的查询,它与你已经做的类似

SELECT R.*, c.URL, (SELECT p.Name FROM Photo p WHERE p.ConcertID = R.CurID ORDER BY RAND() LIMIT 1) AS PhotoName
FROM 
(SELECT GalleryID, AddedDate,(SELECT ConcertID FROM Concert c WHERE c.GalleryID = g.GalleryID ORDER BY RAND() LIMIT 1) AS CurID
FROM Gallery g
ORDER BY AddedDate DESC LIMIT 8) AS R
JOIN Concert c ON R.CurID = c.ConcertID

【讨论】:

  • 谢谢!这正是我想要的。
【解决方案2】:

在您的查询中,“FROM”子句中有一个相关的子查询。从那里开始,事情变得越来越混乱。

您似乎正在尝试获取一张与音乐会相关联的照片(位于画廊中)。您可以通过将相关子查询移动到“SELECT”子句来做到这一点:

SELECT galleryID, addedDate, c.concertID, c.URL,
       (select name
        from photo p
        where p.concertID = c.concertId
        order by rand()
        limit 1
       ) photoname
FROM concert c left join
      gallery g
      ON g.galleryID = c.galleryID
ORDER BY addedDate DESC
LIMIT 8;

要从 8 个不同的画廊获取 8 张照片,请尝试以下操作:

SELECT galleryID, addedDate, c.concertID, c.URL,
       (select name
        from photo p
        where p.concertID = c.concertId
        order by rand()
        limit 1
       ) photoname
FROM (select g.*
      from gallery g
      order by rand()
      limit 8
     ) g join
     concert c
     ON g.galleryID = c.galleryID
where c.concert_id =
          (select csub.concert_id
           from concert csub
           where csub.galleryID = g.galleryID
           order by rand()
           limit 1
          ) 
ORDER BY addedDate DESC

【讨论】:

  • 感谢您的帮助,但我想我需要解释更多。您的查询将为我提供 1 个画廊的 8 个最新帖子。但我想要 1 个来自 8 个不同画廊的随机帖子,而不仅仅是 1 个。
  • 如果画廊只需要概率不同,则将最后的“order by addedDate”替换为“order by rand()”。
  • 这会给我错误:#1051 - 未知表 'c'。而且我也觉得 select c.* select g.* 只能包含一个操作数?
猜你喜欢
  • 1970-01-01
  • 2015-09-01
  • 2011-11-17
  • 2017-07-26
  • 2023-02-10
  • 2011-10-12
  • 2018-02-22
  • 2021-08-17
  • 2015-12-28
相关资源
最近更新 更多