0

わかりました、あきらめます。このクエリは私の頭の中にあります。助けを求めています。

MySQL データベース内には、標準のブログ システムと同様に、カテゴリと投稿テーブルがあります。

tblCategories (intID (PK), strTitle)
tblAreas (intID (PK), strName)
tblPosts (intID (PK), intCategoryID (FK), strTitle, htmlText)

次に、ブログをサポートするテーブルがいくつかあります。

tblExternalLinks (intID (PK), intPostID (FK), strTitle, urlLink)
tblComments (intID (PK), intPostID (FK), strComment)
tblImages (intID (PK), intPostID (FK), urlImage)
tblLocations (intID (PK), intPostID (FK), intAreaID (FK), urlImage)
  1. カテゴリ変数 (疑似 php コードで言いましょう) $intCatID に関連付けられているすべての投稿のリストが必要で、特定のエリア変数 $intAreaID を持つ場所があります。この SQL は次のようになります。

    SELECT tblPosts.* from tblPosts 
    INNER JOIN tblLocations ON tblLocations.intPostID=tblPosts.intID 
    WHERE intCategoryID=$intCatID AND intAreaID=$intAreaID GROUP BY tblPosts.intID;
    

    これが正しいかどうか誰か教えてください。GROUP BY 部分についてはよくわかりません。

  2. 同じリストが必要ですが、今回はサポート テーブル内の他のすべての添付レコードのカウントを使用します。

    SELECT tblPosts.*, intExternalLinksCount, intCommentsCount, intImagesCount, intLocationsCount ...
    

    私の最初の推測は、ネストされたテーブルまたは結合を使用してカウントを取得することです。これにより、クエリが非常に大きくなる可能性があります。また、パフォーマンスのために何が速いのだろうか。これらのことは、私が頭をぶつけるところです。

そして、答えは非常に高く評価されています...

4

1 に答える 1

0

そして、批判的なフィードバックを受け取りたいという理由だけで、次の (非常に醜い) クエリを思いつきました。

SELECT 
tblPosts.*, 
tblTempLocations.intLocationsCount, 
tblTempLinks.intLinksCount, 
tblTempImages.intImagesCount, 
tblTempComments.intCommentsCount,
tblTempNearest.fltNearestLocationAngle
FROM tblAdverts 
LEFT JOIN 
 (SELECT intPostID, count(*) as intLocationsCount 
  FROM tblLocations 
  GROUP BY intPostID)
 tblTempLocations ON tblPosts.intID=tblTempLocations.intPostID
LEFT JOIN 
 (SELECT intPostID, count(*) as intLinksCount 
  FROM tblLinks 
  GROUP BY intPostID)
 tblTempLinks ON tblPosts.intID=tblTempLinks.intPostID
LEFT JOIN 
 (SELECT intPostID, count(*) as intImagesCount
  FROM tblImages
  GROUP BY intPostID)
 tblTempImages ON tblPosts.intID=tblTempImages.intPostID
LEFT JOIN 
 (SELECT intPostID, count(*) as intReviewsCount 
  FROM tblComments
  GROUP BY intPostID)
 tblTempComments ON tblPosts.intID=tblTempComments.intPostID
LEFT JOIN
 (SELECT intPostID, 
  MIN(SQRT(POWER((fltLatitude - $fltCurrentLatitude), 2) + POWER((fltLongitude - $fltCurrentLongitude),2))) AS fltNearestLocationAngle 
  FROM tblLocations 
  GROUP BY intPostID) 
 tblTempNearest ON tblPosts.intID=tblTempNearest.intPostID
INNER JOIN tblLocations ON tblPosts.intID=tblLocations.intPostID
WHERE tblLocations.intLocationID=$intAreaID  AND tblPosts.strTitle LIKE '%$strPartialTitle%' AND tblAdverts.intCategoryID=$intCatID
GROUP BY tblAdverts.intID
于 2013-03-27T00:34:26.113 に答える