0

こんにちは私はいくつかのクエリを1つにまとめようとしていますが、これを解決する方法がわかりません。他にも何百万もの例があることは知っていますが、それらをクエリに変換する方法がわかりません。

これがデータベースです。最初はテーブル名です:次に、主キーと外部キー

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ギャラリー(行ごとに1つのgalleryIDで、同じ8つではありません)、concertIDとURL FROMコンサート(同じconcertIDを持つ1つのランダムな投稿)、FROM写真(同じconcertIDを持つ1つのランダムな投稿)です。これらの結果を私に与えます:

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;
4

2 に答える 2

0

クエリでは、「FROM」句に相関サブクエリがあります。そして、物事はそこからさらに混乱しつつあります。

コンサートに関連付けられている写真を1枚取得しようとしているようです(ギャラリーにあります)。これを行うには、相関サブクエリを「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
于 2012-08-02T18:22:27.703 に答える
0

SQLでURLがnullになる理由はわかりませんでしたが、すべて値がありますか。

別の形式でクエリをやり直しました。これは、すでに行っていることと似ています。

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
于 2012-08-03T23:24:29.603 に答える