2

スクリプトの1つを最適化しようとしています。これはストックフォトのWebサイト用であり、WHILE WENDループを使用して画像の大きなグリッドを表示し、写真のDB(MySQL)テーブルをループします。

このループ内には、別のWHILE ENDループがあり、各写真内の人の名前を人のテーブルから取得します。

私の質問は、プライマリクエリにJOINを追加することで、この2番目のWHILE WENDループを失うことができますか?

私の混乱は、複数の人を返すことから来ています。1つまたは複数の名前をコンマで区切る方法がわかりません。わかりません。私のスクリプトはそのままでも問題ないかもしれませんが、ネストされたループがないともっと速くなると確信しています。ある時点で、写真ごとに最初の5つのキーワードを返す別のクエリを追加することを考えているからです。別のループを追加したい!

スクリーンショット

ここに画像の説明を入力してください

私の疑似コード

Set rsPhotos = Conn.Execute(" " _
& "SELECT photoID, setID, caption, dateCreated, dateUploaded " _
& "FROM photos ORDER BY dateCreated DESC;)"

While NOT rsPhotos.EOF
    Response.Write "<div>"
        Response.Write "<img src=""photo.jpg"">"
        Response.Write "<p>"
            people_str = ""
            Set rsPeople = Conn.Execute("SELECT p.person FROM photoPeople AS pp " _
            & "LEFT JOIN people AS p USING (personID) " _
            & "WHERE pp.photoID = "&rsPhotos.Fields("photoID")&" " _
            & "ORDER BY p.person ASC;")
            While NOT rsPeople.EOF
                people_str = people_str & ", " & rsPeople.Fields("person")
            rsPeople.MoveNext
            Wend
            rsPeople.Close
            Response.Write Mid(people_str,3)
        Response.Write "</p>"
    Response.Write "<div>"
rsPhotos.MoveNext
Wend

rsPhotos.Close

DBスキーマ

PHOTOS tbl
photoID        |   INT 9
setID          |   INT 9
caption        |   VARCHAR2000
dateCreated    |   DATETIME
dateUploaded   |   DATETIME

PHOTOPEOPLE tbl
photoID        |   INT 9
personID       |   INT 7

PEOPLE tbl
personID       |   INT 7
person         |   VARCHAR 100
4

1 に答える 1

4

これでうまくいくはずです-

SELECT photos.photoID, photos.setID, photos.caption, photos.dateCreated, photos.dateUploaded, GROUP_CONCAT(p.person ORDER BY p.person ASC SEPARATOR ', ')
FROM photos
LEFT JOIN photoPeople AS pp
    ON photos.photoID = pp.photoID
LEFT JOIN people AS p
    ON pp.personID = p.personID
GROUP BY photos.photoID
ORDER BY dateCreated DESC

GROUP_CONCAT()

于 2012-04-08T22:37:13.860 に答える