2013-03-25 25 views
0

好吧,我放棄了,這個查詢已經過去了,我正在尋求幫助。BLOG系統SQL summery查詢問題

裏面一個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,並有一個 位置與一個特定的AR變量$ 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 ... 
    

    我的第一個猜測是使用嵌套表格檢索計數或 連接,這可能會使查詢非常大。我也懷疑 性能更快。這些東西是我砰的一聲我的 頭。

和答案都高度讚賞...

+2

GROUP BY用於與聚合函數結合使用。這些函數通常包含在SELECT子句中,但這不是必需條件。通常,出現在SELECT子句中的任何非聚合列必須包含在GROUP BY子句中。在與標準的偏離中,MySQL會原諒這種遺漏。這隻意味着你最終會得到不可預知的結果。 – Strawberry 2013-03-25 12:12:18

+0

考慮提供一個小而有代表性的數據集(作爲SQLFIDDLE和/或'DDLs'),以及您期望從查詢中獲得的結果集。 – Strawberry 2013-03-25 12:13:55

+0

不,因爲那樣我會問一個確切的查詢解決方案,而我想要一個我理解的僞查詢(並自己構建查詢)。完美的答案將是一個正確的結構查詢,其中的解決方案是可見的,但不一定工作。此外,上述表格和字段名稱已更改爲保護商業貿易知識(當然)。因此,精確的查詢不會是一個解決方案。我認爲這個問題已經足夠清楚了...... – 2013-03-25 14:00:08

回答

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