代码之家  ›  专栏  ›  技术社区  ›  collimarco

复杂SQL查询

sql
  •  1
  • collimarco  · 技术社区  · 17 年前

    我有这些桌子:

    - Users
        - id
    - Photos
        - id
        - user_id
    - Classifications
        - id
        - user_id
        - photo_id
    

    我想按用户拥有的照片总数+分类来订购用户。

    我写了这个问题:

    SELECT users.id, 
    COUNT(photos.id) AS n_photo, 
    COUNT(classifications.id) AS n_classifications, 
    (COUNT(photos.id) + COUNT(classifications.id)) AS n_sum 
    FROM users 
    LEFT JOIN photos ON (photos.user_id = users.id) 
    LEFT JOIN classifications ON (classifications.user_id = users.id) 
    GROUP BY users.id 
    ORDER BY (COUNT(photos.id) + COUNT(classifications.id)) DESC
    

    问题是,这个查询不能像我期望的那样工作,并且返回大量的数据,而我在数据库中只有一些照片和分类。它返回如下内容:

    id n_photo n_classifications   n_sum
    29  19241   19241                   38482
    16  16905   16905                   33810
    1    431     0                       431
    ...
    4 回复  |  直到 17 年前
        1
  •  4
  •   Gary W    17 年前

    您缺少distinct。

      SELECT U.ID, COUNT(DISTINCT P.Id)+COUNT(DISTINCT C.Id) Count
      FROM User U
      LEFT JOIN Photos P ON P.User_Id=U.Id
      LEFT JOIN Classifications C ON C.User_Id=U.Id
      GROUP BY U.Id
      ORDER BY COUNT(DISTINCT P.Id)+COUNT(DISTINCT C.ID)
    
        2
  •  1
  •   Blorgbeard    17 年前

    我可能误解了你的计划,但这不应该是:

    LEFT JOIN classifications ON (classifications.user_id = users.id) 
    

    是这样的:

    LEFT JOIN classifications ON (classifications.user_id = users.id) 
                             AND (classifications.photo_id = photos.id)
    

    ?

        3
  •  0
  •   Lieven Keersmaekers    17 年前
    SELECT users1.id, users1.n_photo, users2.n_classifications
    FROM (
        SELECT users.id, COUNT(photos.id) AS n_photo
        FROM users LEFT OUTER JOIN photos ON photos.user_id = users.id
        GROUP BY users.id
      ) users1
      INNER JOIN (
        SELECT users.id, COUNT(classifications.id) AS n_classifications
        FROM users LEFT OUTER JOIN classifications ON classifications.user_id = users.id
        GROUP BY users.id
      ) users2 ON users1.id = users1.id
    
        4
  •  0
  •   Remy Lebeau    17 年前

    改为尝试类似的方法:

    SELECT users.id as n_id,
    (SELECT COUNT(photos.id) FROM photos WHERE photos.user_id = n_id) AS n_photos,
    (SELECT COUNT(classifications,id) FROM classifications WHERE classifications.user_id = n_id) AS n_classifications,
    (n_photos + n_classifications) AS n_sum
    FROM users
    GROUP BY n_id
    ORDER BY n_sum DESC