2012-08-02 17 views
0

嗨我想结合一个查询到一个,但我不确定如何解决这个问题。我知道还有其他数百万个示例,但我无法弄清楚如何将它们翻译成我的查询。如何将SELECT SQL subquerys与RAND结合起来?

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

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从画廊(1 galleryID每行NOT 8相同),concertID和URL从音乐会(同一concertID 1随机文章),名称从照片(1随机文章sameon 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; 

我自己也尝试用这种错误#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; 
+0

你有一个空的URL的演唱会?当你得到一个空网址时,试着为该音乐会ID选择'从音乐会中选择*'来检查它是否为空。 – theon 2012-08-02 17:30:25

+0

我假设你从语法中使用mysql。这是真的? – 2012-08-02 18:13:41

+0

不,URL没有NULL。我认为这是因为运行similtanius的2个subquerys curID不匹配。是的,我正在使用MySQL。 – user1571965 2012-08-02 22:04:37

回答

0

我看不到任何理由在你的SQL中,为什么你的网址为空,它们都有价值吗?

我已经重做查询另一种格式,它类似于你已经做

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 
+1

谢谢!这正是我想要的。 – user1571965 2012-08-06 09:47:02

0

一个加入您的查询要做到这一点,你必须在“FROM”子句相关子查询。事情变得越来越混乱。

它看起来像你试图获得与音乐会(这是在一个画廊)相关的一张照片。您可以通过相关子查询移动到“选择”条款做到这一点:

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 
+0

感谢您的帮助,但我想我需要解释更多。您的查询将为我提供8张最新帖子的1张图片。但我想要从8个不同的画廊的1个随机发布不只是1. – user1571965 2012-08-02 21:33:12

+0

如果画廊只需要在概率上有所不同,然后用“order by rand()”替换上次“AddedDate的订单”。 – 2012-08-02 21:35:50

+0

这会给我错误:#1051 - 未知的表'c'。我也认为选择c。* select g。*只能包含一个操作数? – user1571965 2012-08-02 21:56:29

相关问题