MYSQL Query - левое соединение пропускается с неверным результатом - PullRequest
0 голосов
/ 21 января 2019

Вот мой SQLFiddle - http://www.sqlfiddle.com/#!9/9de13b/1

Если я удаляю следующее из запроса ниже, он все равно дает тот же результат (в моей базе данных есть данные за разные годы, семестры и курсы):

 WHERE 
      Assignments.Year = '2018' 
      AND Assignments.CourseNumber = 'PHED 1164' 
      AND Assignments.Semester = 'fall' 
      AND Assignments.Assignment = 'Fitbit'

Запрос:

SELECT 
  c.username AS Username, 
  ROUND(
    LEAST(
      GREATEST(
        AVG(
          activities.fairly_act_min + activities.vact_min
        )/(
          (
            c.max_avgweeklymin - c.min_avgweeklymin
          )/ c.max_percent
        ), 
        AVG(activities.steps)/(
          (c.max_avgsteps - c.min_avgsteps)/ c.max_percent
        )- c.max_percent
      ), 
      100
    ), 
    1
  ) AS 'Activity Log Points Grade', 
  '#' AS 'End-of-Line Indicator' 
FROM 
  activities 
  JOIN (
    SELECT 
      Students.encodedid, 
      Students.username, 
      g.* 
    FROM 
      Assignments 
      LEFT JOIN Students ON Assignments.SectionNumber = Students.SectionNumber 
      LEFT JOIN (
        SELECT 
          section, 
          MAX(avgweeklymin) max_avgweeklymin, 
          MIN(avgweeklymin) min_avgweeklymin, 
          MAX(percent) max_percent, 
          MAX(avgsteps) max_avgsteps, 
          MIN(avgsteps) min_avgsteps 
        FROM 
          GradingScale 
        GROUP BY 
          section
      ) g ON Assignments.SectionNumber = g.section 
    WHERE 
      Assignments.Year = '2018' 
      AND Assignments.CourseNumber = 'PHED 1164' 
      AND Assignments.Semester = 'fall' 
      AND Assignments.Assignment = 'Fitbit'
  ) c ON activities.encodedid <> '' 
  AND activities.encodedid = c.encodedid 
  JOIN (
    SELECT 
      id, 
      encodedid, 
      GROUP_CONCAT(
        fairly_act_min + vact_min 
        ORDER BY 
          (fairly_act_min + vact_min)* 1 DESC
      ) grouped_steps 
    FROM 
      activities 
    GROUP BY 
      encodedid, 
      WEEK(
        DATE_ADD(activitydate, INTERVAL 1 DAY)
      )
  ) p ON activities.id = p.id 
  AND FIND_IN_SET(
    fairly_act_min + vact_min, grouped_steps
  ) <= 5 
GROUP BY 
  c.encodedid;

Я не понимаю, почему игнорируется мое ГДЕ.Как можно переписать этот запрос для получения правильного результата?

Вот что я пытаюсь сделать: я отслеживаю активность своих учеников и шаги, используя трекер активности.Им присваивается еженедельная оценка в зависимости от их активности.Они оцениваются по лучшим 5 дням недели.Оценки шагов и активных минут основаны на еженедельной средней оценке шагов и активных минут.Итоговая оценка основана на том, что было выше по шкале оценок между оценкой шагов и оценкой активных минут.

Запрос, который я разместил здесь, будет выполнен в конце семестра для расчета каждогоитоговый балл студентов.

Вот мой текущий результат:

Имя пользователя, Оценка журнала активности, Индикатор конца строки mousel, 44,4, #

Вот мой ожидаемый результатвывод:

Username| Activity Log Points Grade| End-of-Line Indicator|
mousel  |        24                |         #            |

Надеюсь, это имеет смысл!

Заранее спасибо,

Тим

Вот моя схема:

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

CREATE TABLE `activities` (
  `id` int(11) NOT NULL,
  `steps` mediumint(6) UNSIGNED DEFAULT NULL,
  `lightly_act_min` varchar(50) NOT NULL,
  `fairly_act_min` varchar(50) NOT NULL,
  `sed_act_min` varchar(50) NOT NULL,
  `vact_min` varchar(50) NOT NULL,
  `encodedid` varchar(25) NOT NULL,
  `activitydate` date NOT NULL,
  `username` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `activities` (`id`, `steps`, `lightly_act_min`, `fairly_act_min`, `sed_act_min`, `vact_min`, `encodedid`, `activitydate`, `username`) VALUES
(76139, 9416, '254', '72', '642', '75', '29BD68', '2018-10-01', ''),
(106553, 0, '0', '0', '1440', '0', '29BD68', '2018-08-28', ''),
(106554, 126, '6', '0', '1434', '0', '29BD68', '2018-08-29', ''),
(106555, 9768, '257', '57', '629', '73', '29BD68', '2018-08-30', ''),
(106556, 4884, '150', '20', '865', '14', '29BD68', '2018-08-31', ''),
(106557, 7246, '170', '81', '778', '56', '29BD68', '2018-09-01', ''),
(106575, 0, '18', '5', '1018', '33', '29BD68', '2018-09-19', ''),
(106576, 65, '20', '21', '1366', '33', '29BD68', '2018-09-20', ''),
(106577, 34, '13', '3', '1331', '25', '29BD68', '2018-09-21', ''),
(106578, 18, '5', '0', '1435', '0', '29BD68', '2018-09-22', ''),
(106579, 32, '0', '0', '1440', '0', '29BD68', '2018-09-23', ''),
(106580, 6, '0', '0', '1440', '0', '29BD68', '2018-09-24', ''),
(106581, 10320, '251', '121', '585', '34', '29BD68', '2018-09-25', ''),
(106582, 5974, '236', '32', '723', '3', '29BD68', '2018-09-26', ''),
(106583, 8455, '239', '47', '733', '27', '29BD68', '2018-09-27', ''),
(106584, 6262, '204', '71', '765', '10', '29BD68', '2018-09-28', ''),
(123953, 40, '1', '0', '1439', '0', '29BD68', '2018-11-11', ''),
(123954, 639, '48', '0', '1392', '0', '29BD68', '2018-11-12', ''),
(123955, 5878, '270', '76', '485', '36', '29BD68', '2018-11-13', ''),
(123956, 7485, '330', '81', '1014', '15', '29BD68', '2018-11-14', ''),
(123957, 5372, '270', '53', '545', '0', '29BD68', '2018-11-15', ''),
(124888, 4699, '214', '12', '825', '6', '29BD68', '2018-11-16', ''),
(125819, 0, '2', '0', '1438', '0', '29BD68', '2018-11-17', ''),
(126750, 0, '0', '0', '1440', '0', '29BD68', '2018-11-18', ''),
(129533, 5070, '279', '14', '728', '14', '29BD68', '2018-11-19', ''),
(129534, 6471, '256', '124', '657', '15', '29BD68', '2018-11-20', ''),
(129535, 3475, '144', '9', '722', '29', '29BD68', '2018-11-21', ''),
(131405, 232, '16', '0', '965', '0', '29BD68', '2018-11-22', ''),
(131406, 3546, '135', '1', '791', '18', '29BD68', '2018-11-23', ''),
(133276, 6143, '278', '71', '657', '24', '29BD68', '2018-11-24', '');

ALTER TABLE `activities`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `encodedid` (`encodedid`,`activitydate`) USING BTREE;

ALTER TABLE `activities`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=230103;
COMMIT;

CREATE TABLE `Assignments` (
  `AssignmentID` int(11) NOT NULL,
  `Assignment` enum('Fitbit','Written Paper','Fitness Assessment') NOT NULL,
  `PointsPossible` int(11) NOT NULL DEFAULT 0,
  `CourseNumber` varchar(90) NOT NULL,
  `SectionNumber` varchar(8) NOT NULL,
  `Semester` enum('Fall','Spring','Summer1','Summer2','Winter','May') NOT NULL,
  `Year` year(4) NOT NULL,
  `PreStartDate` datetime NOT NULL,
  `PreEndDate` datetime NOT NULL,
  `PostStartDate` datetime NOT NULL,
  `PostEndDate` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `Assignments` (`AssignmentID`, `Assignment`, `PointsPossible`, `CourseNumber`, `SectionNumber`, `Semester`, `Year`, `PreStartDate`, `PreEndDate`, `PostStartDate`, `PostEndDate`) VALUES
(47, 'Fitbit', 100, 'PHED 1164', '5073', 'Fall', 2018, '2018-09-03 00:00:00', '2018-12-07 23:30:00', '2018-09-03 00:00:00', '2018-12-07 23:30:00'),
(48, 'Fitbit', 100, 'PHED 1164', '5075', 'Fall', 2018, '2018-09-03 00:00:00', '2018-12-07 23:30:00', '2018-09-03 00:00:00', '2018-12-07 23:30:00'),
(49, 'Fitbit', 100, 'PHED 1164', '5019', 'Fall', 2018, '2018-09-03 00:00:00', '2018-12-12 23:30:00', '2018-09-03 00:00:00', '2018-12-12 23:30:00'),
(61, 'Fitness Assessment', 100, 'PHED 1164', '5087', 'Fall', 2018, '2018-09-23 00:00:00', '2018-10-01 23:30:00', '2018-11-30 00:00:00', '2018-12-07 23:30:00');

ALTER TABLE `Assignments`
  ADD PRIMARY KEY (`AssignmentID`);
ALTER TABLE `Assignments` ADD FULLTEXT KEY `section_number_index` (`SectionNumber`);

ALTER TABLE `Assignments`
  MODIFY `AssignmentID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=91;
COMMIT;

CREATE TABLE `Students` (
  `id` bigint(20) NOT NULL,
  `SectionNumber` varchar(8) NOT NULL,
  `first` varchar(30) NOT NULL,
  `last` varchar(30) NOT NULL,
  `username` varchar(50) NOT NULL DEFAULT '',
  `semester` enum('fall','spring','summer1','summer2','winterminimester','mayminimester') NOT NULL,
  `year` year(4) NOT NULL,
  `CourseNumber` varchar(90) NOT NULL,
  `passtext` varchar(255) NOT NULL DEFAULT '',
  `email` varchar(200) NOT NULL DEFAULT '',
  `created` date DEFAULT NULL,
  `active` enum('y','n') NOT NULL DEFAULT 'y',
  `visitorIP` varchar(15) NOT NULL DEFAULT '',
  `aboutme` text NOT NULL,
  `age` char(3) NOT NULL DEFAULT '',
  `regkey` varchar(25) NOT NULL DEFAULT '',
  `goal_start` date NOT NULL,
  `goal` enum('muscle','weight','perform','toning') NOT NULL,
  `encodedid` varchar(25) NOT NULL,
  `accesstoken` varchar(2000) NOT NULL,
  `accesstoken_expiry` datetime DEFAULT NULL,
  `refreshtoken` varchar(2000) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `Students` (`id`, `SectionNumber`, `first`, `last`, `username`, `semester`, `year`, `CourseNumber`, `passtext`, `email`, `created`, `active`, `visitorIP`, `aboutme`, `age`, `regkey`, `goal_start`, `goal`, `encodedid`, `accesstoken`, `accesstoken_expiry`, `refreshtoken`) VALUES
(8, '5075', 'Tim', 'Mousel', 'mousel', 'fall', 2018, 'PHED 1164', '$2y$12$FDSvsMUpSQ79THcC6eCij.YjDFbwGQhHozvcJVa81tD4oYKAyrRi2', 'mousel@defend.net', '2018-03-26', 'y', '99.165.89.33', '', '', '8630082118400458833008407', '0000-00-00', 'muscle', '29BD68', 'eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIyMkNWWkYiLCJzdWIiOiIyOUJENjgiLCJpc3MiOiJGaXRiaXQiLCJ0eXAiOiJhY2Nlc3NfdG9rZW4iLCJzY29wZXMiOiJyd2VpIHJhY3QgcmhyIHJwcm8gcm51dCIsImV4cCI6MTU0ODA1NjI0MywiaWF0IjoxNTQ4MDI3NDQzfQ.K5Pag0_4EfME21I5aUrPqwPE-otPQH458jidDl1FvgM', '2019-01-21 07:37:23', '1498d6c65ceaa43daf5a40db4af60a16a9cb37b96d86de3635c1a4ff89723574');

ALTER TABLE `Students`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `Students` ADD FULLTEXT KEY `encodedid_index` (`encodedid`);

ALTER TABLE `Students`
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=459;
COMMIT;

CREATE TABLE `GradingScale` (
  `id` int(11) NOT NULL,
  `letter` enum('A','B','C','D','F') NOT NULL,
  `percent` smallint(4) NOT NULL,
  `avgsteps` smallint(6) NOT NULL,
  `avgweeklymin` smallint(4) NOT NULL,
  `section` varchar(8) NOT NULL,
  `AssignmentID` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Grading Scale';


INSERT INTO `GradingScale` (`id`, `letter`, `percent`, `avgsteps`, `avgweeklymin`, `section`, `AssignmentID`) VALUES
(1101, 'A', 100, 10000, 100, '5075', 1),
(1102, 'A', 90, 9500, 90, '5075', 1),
(1103, 'B', 80, 9000, 80, '5075', 1),
(1104, 'C', 70, 8500, 70, '5075', 1),
(1105, 'D', 60, 8000, 60, '5075', 1),
(1106, 'F', 50, 7500, 50, '5075', 1),
(1107, 'F', 40, 7000, 40, '5075', 1),
(1108, 'F', 30, 6500, 30, '5075', 1),
(1109, 'F', 20, 6000, 20, '5075', 1),
(1110, 'F', 10, 5500, 10, '5075', 1),
(1111, 'F', 0, 5000, 0, '5075', 1);

ALTER TABLE `GradingScale`
  ADD PRIMARY KEY (`id`) USING BTREE,
  ADD UNIQUE KEY `section` (`section`,`percent`,`letter`) USING BTREE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...