2012-04-08 5 views
2

私はスクリプトを最適化しようとしています。これは在庫写真のウェブサイト用であり、WHILE WENDループを使用して画像の大きなグリッドを表示し、DB(MySQL)テーブルの写真をループして表示します。従来のASP - 結合と引き換えにネストループを失うことはできますか?

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

私の主な質問にJOINを追加することで、この2番目のWHILE WENDループを失うことはできますか?

私の混乱は、複数の人を返すことに由来します。 1つ以上の名前をコンマで区切って取得する方法を理解できません。わかりません。たぶん私のスクリプトは大丈夫ですが、入れ子にされたループがなければすばやくできると確信しています。なぜなら、ある時点では、各写真の最初の5つのキーワードを返す別のクエリを追加し、別のループを追加したい!

スクリーンショット

enter image description here

MY擬似コード

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

これはそれを行う必要があります -

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()

+1

WOW、おかげでたくさん!それは私の以前の方法よりも効果的に機能しています。あなたが私にGROUP_CONCATを導入してうれしいです。私はこれのために多くの場所を持っています。また、私のORDER BY人の条件に注意を払い、コンカット関数セパレータにスペースとカンマ(、)を追加してくれてありがとう。素晴らしい答え! – TheCarver

+1

非常に便利な機能ですが、GROUP_CONCATによって返される文字列の長さは、システム変数group_concat_max_lenによって制限されることに注意する必要があります。 – nnichols

+1

私がチェックしたのは:私の場合、デフォルト値は1枚の写真の人数の最大値が4であるので十分なはずです(1024)。私はこの変数を変更できないように共有ホスティングを使用しています。私は他のプロジェクトでこれを頭に入れています。ありがとう。 – TheCarver

関連する問題