LEFT JOIN WHERE中的MySQL COUNT

时间:2014-08-09 20:26:34

标签: mysql count group-by left-join where-clause

我不是专家,在回答我的问题时请记住这一点...... 我已经在stackoverflow上阅读了很多其他关于这里的例子,但我根本不理解如何将它用于我的任务。

我有一张相册数据库表和一张Photo数据库表:

table_album:

album_id   album_creatoruser_id
-------------------------------
   1           777
   2           777
   3           777

table_photos:

photo_id   photo_album_id
-------------------------
   1            1
   2            1
   3            1
   4            1
   5            2
   6            2
   7            3
   8            3
   9            3

现在,我想在我的示例中album_creatoruser_id=777

获取用户创建的所有照片的总和

我确信它可以直接在MySQL中使用一个查询或子查询,或者使用LEFT JOIN或GROUP BY,但我无法使其工作,因为我不明白构建此查询的逻辑。

如何计算特定photo_id创建的所有album_id行的album_creatoruser_id行的任何帮助都会很棒!

简而言之: album_creatoruser_id 777 有多少张照片?

2 个答案:

答案 0 :(得分:1)

子查询的第一种可能性,用户777创建的所有照片的计数:

 SELECT 
      COUNT(*)
 FROM photo
 WHERE
      photo_album_id IN 
      (
           SELECT album_id 
           FROM album 
           WHERE album_creatoruser_id = 777
      )

其他:

 SELECT 
     COUNT(*)
 FROM photo p, album a
 WHERE 
     p.photo_album_id = a.album_id 
     AND a.album_creatoruser_id = 777

并加入

 SELECT 
      COUNT(*)
 FROM photo p 
 JOIN album a
 ON p.photo_album_id = a.album_id     
 WHERE 
      a.album_creatoruser_id = 777

这里没有必要进行分组,因为我们不希望在组中显示数据。

答案 1 :(得分:1)

您的基本查询是:

   SELECT COUNT(*)
     FROM table_album ta
     JOIN table_photo tp
       ON tp.photo_album_id = ta.album_id     
    WHERE album_creatoruser_id = **input**

我建议运行以下查询以了解其工作原理:

   SELECT *
     FROM table_album ta
     JOIN table_photo tp
       ON tp.photo_album_id = ta.album_id

会在table_album条件下返回table_photo的所有行及其各自的tp.photo_album_id = ta.album_id条记录。

   SELECT *
     FROM table_album ta
     JOIN table_photo tp
       ON tp.photo_album_id = ta.album_id
    WHERE album_creatoruser_id = **input**

仅将这些行过滤为album_creatoruser_id = **input**

   SELECT COUNT(*)
     FROM table_album ta
     JOIN table_photo tp
       ON tp.photo_album_id = ta.album_id
    WHERE album_creatoruser_id = **input**

计算这些行,返回一个聚合行(COUNT()是一个聚合函数,如SUM()MAX()),结果是,您不需要{{1}因为只有一个组;所有过滤的行。

如果你想要所有的GROUP BY s各自的计数我会建议:

album_creatoruser_id