Запустить подзапрос для каждого результата запроса в MS Access - PullRequest
0 голосов
/ 30 октября 2019

В настоящее время я использую этот SQL-код в приложении PHP, и мне нужно преобразовать его в MS Access.

Мне нужно выполнить второй запрос для каждого результата с первого, чтобы в конечном итоге было подсчитано количество гонщиков в каждом. Гонка Всадник в первой гонке побежал. (соревнования по мотогонкам)

Довольно просто с PHP (я могу предоставить полный код для этого при необходимости)

Не совсем уверен, как начать с Access. (оба запроса отлично работают в Access, но я не могу присоединиться к ним так, как мне нужно)

Запрос 1:

SELECT schedule2.Date, riders.ridername, results.finish, results.points, classes.class, seasons.season
FROM schedule2 RIGHT JOIN (classes RIGHT JOIN ((riders RIGHT JOIN results ON riders.id = results.rider_id) LEFT JOIN seasons ON results.season_id = seasons.id) ON classes.id = results.class_id) ON schedule2.id = results.schedule_id
GROUP BY schedule2.Date, riders.ridername, results.finish, results.points, classes.class, seasons.season, schedule2.id, results.class_id, riders.id
HAVING (((riders.id)=[:id]))
ORDER BY schedule2.Date;

Запрос 2:

SELECT DISTINCT Count(results.rider_id) AS CountOfrider_id
FROM seasons RIGHT JOIN (results LEFT JOIN schedule2 ON results.schedule_id = schedule2.id) ON seasons.id = schedule2.season_id
GROUP BY schedule2.id, results.class_id
HAVING (((schedule2.id)=[:scheduleId]) AND ((results.class_id)=[:classId]));

текущее приложение PHP создает этот набор результатов: (идентификатор райдера выбирается с помощью формы)

enter image description here

Оригинальный PHP (для справки)

            $getRiderInfo = $dbh->prepare('
                    SELECT riders.ridername, 
                          schedule2.date, 
                          schedule2.id AS scheduleId, 
                          results.class_id AS classId, 
                          results.finish, 
                          results.points, 
                          classes.class, 
                          seasons.season, 
                          riders.id 
                    FROM schedule2 
                    RIGHT JOIN (classes 
                                RIGHT JOIN ((riders 
                                             RIGHT JOIN results 
                                             ON riders.id = results.rider_id) 
                    LEFT JOIN seasons 
                      ON results.season_id = seasons.id) 
                      ON classes.id = results.class_id) 
                      ON schedule2.id = results.schedule_id
                    GROUP BY riders.ridername, 
                             schedule2.date, 
                             classes.class, 
                             seasons.season
                    HAVING (((riders.id)=:id))
                    ORDER BY schedule2.date ASC;
            ');
            $getRiderInfo->bindValue('id', $racer_id);
            if ($getRiderInfo->execute()) {
                while ($iRows = $getRiderInfo->fetch(PDO::FETCH_ASSOC)) {
                    $getCounts = $dbh->prepare('
                            SELECT DISTINCT COUNT(results.rider_id) AS CountOfrider_id,
                                   schedule2.id,
                                   results.class_id
                            FROM seasons
                            RIGHT JOIN(results
                            LEFT JOIN schedule2
                            ON results.schedule_id = schedule2.id) 
                            ON seasons.id = schedule2.season_id
                            GROUP BY schedule2.id , 
                                     results.class_id
                            HAVING (((schedule2.id) = :scheduleId)
                            AND ((results.class_id) = :classId));
                    ');
                    $getCounts->bindValue('scheduleId', $iRows['scheduleId']);
                    $getCounts->bindValue('classId', $iRows['classId']);
                    if ($getCounts->execute()) {
                        while ($iRows1 = $getCounts->fetch(PDO::FETCH_ASSOC)) {
                            $iCount = $iRows1['CountOfrider_id'];
                        }
                    }
                    $iDate = date_create($iRows['date']);
                    echo '<tr><td>' . $iRows['ridername'] . '</td>';
                    echo '<td>' . date_format($iDate, 'm/d/Y') . '</td>';
                    echo '<td>' . $iRows['finish'] . '</td>';
                    echo '<td>' . $iRows['points'] . '</td>';
                    echo '<td>' . $iRows['class'] . '</td>';
                    echo '<td>' . $iRows['season'] . '</td>';
                    echo '<td>' . $iCount . '</td></tr>';
                }
            }

1 Ответ

0 голосов
/ 31 октября 2019

Я нашел лучший способ обойти эту проблему. На самом деле я немного задумался.

Этот набор данных никогда не изменится, так что второй запрос на самом деле не нужен, просто запустил его один раз, чтобы создать таблицу с общим счетчиком, который я ищудля столбца 6 и добавил еще одно объединение к первому запросу. (слишком много объединений уже для отслеживания.)

Это работает для моей цели.

...