sql >> Databasteknik >  >> RDS >> Sqlserver

SQL:Få räkning från många tabeller för en användarpost i USER-tabellen. Vad är det bästa tillvägagångssättet?

Använd:

   SELECT u.userid,
          u.username,
          COALESCE(f.numFiles, 0) AS numFiles,
          COALESCE(p.numPhotos, 0) AS numFiles,
          COALESCE(g.numGroups, 0) AS numGroups
     FROM [USER] u
LEFT JOIN (SELECT t.userid,
                  COUNT(*) AS numFiles
             FROM [FILES] t
         GROUP BY t.userid)f ON f.userid = u.userid
LEFT JOIN (SELECT t.userid,
                  COUNT(*) AS numPhotos
             FROM [PHOTOS] t
         GROUP BY t.userid) p ON p.userid = u.userid
LEFT JOIN (SELECT t.userid,
                  COUNT(*) AS numGroups
             FROM [GROUPS] t
         GROUP BY t.userid) g ON g.userid = u.userid
    WHERE u.userid = 2

Du måste använda OUTER joins för att detta ska vara i en fråga; INNER-anslutningar för alla tabeller kräver att användaren har minst en post i tabellen FILES, PHOTOS och GROUPS för att vara med i resultatuppsättningen. En OUTER-join innebär att användare med poster i minst en av tabellerna (FILER, FOTO eller GRUPPER) kommer att returneras.

Men JOINs riskerar också att blåsa upp resultatuppsättningen, vilket är problemet som uppstod i den tidigare versionen av mitt svar. Genom att ändra frågan till att använda härledda tabeller/inbäddade vyer för FILES, GROUPS och PHOTOS räkningarna, är problemet löst och det finns inget behov av en GROUP BY utanför de härledda tabellerna/inlinevyerna.




  1. Fastnat i fel 2 med mysql med XAMPP

  2. MariaDB CURRENT_DATE() Förklarad

  3. exakt vad gör detta Class.forName(com.mysql.jdbc.Driver).newInstance();

  4. ZF2 - MySQL Regex för hela ordsökningar