programing

하위 쿼리에 가입하려면 어떻게 해야 합니까?

easyjava 2023. 9. 16. 10:05
반응형

하위 쿼리에 가입하려면 어떻게 해야 합니까?

저는 이와 같은 제 데이터를 가지고 있고, 저는 수행된 고유 활동의 총 개수와 수행된 고유 활동의 모든 포인트의 합이 있는 사용자 목록을 가져오려고 노력하고 있습니다. 따라서 사용자가 활동을 13번 반복하면 100에 다른 모든 활동을 더한 것으로 계산됩니다.

이거 해봤는데 안 되는 것 같아요.

SELECT *,
  ( SELECT COUNT(*) 
    FROM done 
     WHERE done.user_id = user.id 
  ) as activity_count
FROM
  user AS user
LEFT JOIN 
  (
    SELECT SUM(points), d.user_id
    FROM done AS d
    LEFT JOIN activity AS a
      ON d.activity_id = a.id
    GROUP BY user_id
  ) AS subtable 
ON  subtable.user_id = user.id

데이터 스키마는 다음과 같습니다.

CREATE TABLE IF NOT EXISTS `user` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC));
CREATE TABLE IF NOT EXISTS `activity` (
  `id` INT NOT NULL,
  `name` VARCHAR(45) NULL,
  `points` INT UNSIGNED NULL,
  PRIMARY KEY (`id`));
CREATE TABLE IF NOT EXISTS `done` (
  `id` INT NOT NULL,
  `user_id` INT UNSIGNED NULL,
  `activity_id` INT UNSIGNED NULL,
  `status` INT UNSIGNED NULL,
  PRIMARY KEY (`id`));

INSERT INTO user
  (`id`, `name`)
  VALUES
   (1, 'User 1'),
   (2, 'User 2'),
   (3, 'User 3'),
   (4, 'User 4');
INSERT INTO activity
   (`id`, `name`, `points`)
  VALUES
   (1, 'activity 1', 100), 
   (2, 'activity 2', 200),
   (3, 'activity 3', 300),
   (4, 'activity 4', 400);
INSERT INTO done
  (`id`, `user_id`, `activity_id`, `status`)
  VALUES
    (1, 1, 1, 2),
    (2, 2, 1, 3),
    (3, 1, 2, 2),
    (4, 3, 1, 1),
    (5, 2, 1, 3),
    (6, 4, 4, 2),
    (7, 3, 1, 1),
    (8, 1, 1, 3);

예상 결과:

user_id,   count_of_unique_activities_done, sum_of_unique_activity_points
1,   2,  300;
2,   1,  100;
3,   1,  100;
4,   1,  400;

완료된 테이블에 새 행을 추가하여 필요한 내용을 설명합니다.

다음과 같이 쿼리를 단순화할 수 있습니다.

SELECT u.id, SUM(a.points), count(a.*)
FROM `user` u
LEFT JOIN done d ON done.user_id = u.id
LEFT JOIN activity a ON d.activity_id = a.id
GROUP BY u.id

제가 원하는 대로 할 수 있었던 것 같은데, 비효율적인 진술인가요?

SELECT activity_done.id, SUM(activity_done.points) as total_points, user_c.name
FROM
    ( 
        SELECT done_c.user_id as id, points
        FROM 
            done as done_c
        LEFT JOIN
            activity as activity_c
        ON
            activity_c.id = done_c.activity_id
        GROUP BY
            done_c.`activity_id`,
            done_c.`user_id`
    ) as activity_done
LEFT JOIN
    user as user_c
    ON 
        user_c.id = activity_done.id
GROUP BY
    activity_done.id

언급URL : https://stackoverflow.com/questions/33789083/how-do-i-left-join-a-subquery

반응형