[mysql] Hjälp med databas-fråga

Tråden skapades och har fått 4 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Karlskrona
  • 2008-08-06 20:19

Jag har tre tabeller (väldigt förenklat):
* forumStructure (forumID)
* forumThreads (forumID, threadID)
* forumPosts (threadID, postID)

Nu vill jag ha fram totalt antal poster i varje forumsdel (dvs summan av alla poster i alla trådar).

Jag har filat på nåt sånt här:

SELECT fs.forumTitle, fp_count.num_posts FROM forumStructure AS fs
  LEFT JOIN forumThreads AS ft ON ft.forumID = fs.forumID
  LEFT JOIN (SELECT threadID, COUNT(*) AS num_posts FROM forumPosts GROUP BY threadID) AS fp_count ON fp_count.threadID = ft.threadID
    GROUP BY fs.forumID

Men det blir inte riktigt rätt. Någon som kan hjälpa?

Senast redigerat 2008-08-06 20:44

Jag hade lagt till en kolumn i forumStructure som håller antalet trådar för den forumsdelen. Sen är det bara att uppdatera det värdet så fort någon skriver ett inlägg. Mycket effektivare och enklare, men kanske inte lika "snyggt".

  • Medlem
  • Karlskrona
  • 2008-08-06 21:11
Ursprungligen av irrelogical:

Jag hade lagt till en kolumn i forumStructure som håller antalet trådar för den forumsdelen. Sen är det bara att uppdatera det värdet så fort någon skriver ett inlägg. Mycket effektivare och enklare, men kanske inte lika "snyggt".

Fast det pajar hela tanken med relationsdatabas. Om någon skriver ett inlägg och sedan raderar det, då måste antalet uppdateras igen. Exempelvis.

Ursprungligen av Frohike:

Fast det pajar hela tanken med relationsdatabas. Om någon skriver ett inlägg och sedan raderar det, då måste antalet uppdateras igen. Exempelvis.

Jag vet, men som sagt, det blir effektivare och enklare. För att få din query att funka så ska du såvitt jag kan se köra subqueryn som ett fält i grundqueryn. (dåligt formulerat)

SELECT fs.forumTitle, (SELECT COUNT(*) FROM forumPosts JOIN osv... ) AS postCount FROM forumStructure osv...
  • Medlem
  • Mölndal
  • 2008-08-06 23:54

Jag ser inte varför man ska krångla till det.

SELECT forumStructure.forumTitle, COUNT(*)
FROM forumPosts
JOIN forumThreads ON forumPosts.threadID = forumThreads.threadID
JOIN forumStructure.forumID = forumThreads.forumID
GROUP BY forumStructure.forumTitle

borde räcka. Ev med LEFT JOINS om du vill ha med lite nollvärden. Man kan ev modifiera queryn med en korrelerad eller okorrelerad subquery, men det är svårt att säga om det går fortare utan att känna till din data. Som vanligt får man prova sig fram. (Jag utgår från att du har index på dina foreign keys.)

Att lägga till en extra kolumn tycker jag känns enormt kladdigt. Normalisering av data ftw liksom! (Visst det finns fall när det är berättigat, men då snackar betydligt tyngre grejer än att räkna poster ur två tabeller.)

1
Bevaka tråden