Сложный SQL-запрос - PullRequest
       8

Сложный SQL-запрос

1 голос
/ 07 августа 2009

У меня есть эти таблицы:

- 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 ]

4 голосов
/ 07 августа 2009

Вам не хватает отчетливого.

  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)
1 голос
/ 07 августа 2009

Я мог бы неправильно истолковать вашу схему, но не должен ли это:

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

Будь таким:

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

0 голосов
/ 07 августа 2009

Попробуйте вместо этого что-нибудь еще:

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
0 голосов
/ 07 августа 2009
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...