MySql выбрать агрегаты из двух таблиц - PullRequest
2 голосов
/ 18 мая 2011

В предыдущем вопросе Я спросил, как вернуть даты последних тестов, пройденных каждым пользователем, на основе трех таблиц: Users , Tests и Проходит .

|--------|---------|---------|---------|---------|---------|
|User    |Test A   |Test B   |Test C   |Test D   |Test E   |
|--------|---------|---------|---------|---------|---------|
|James   |Null     |6/3/11   |Null     |Null     |4/3/11   |
|Mark    |Null     |1/4/11   |8/5/11   |23/5/10  |Null     |
|--------|---------|---------|---------|---------|---------|

Был посоветован следующий запрос:

select
  u.username,
  max(case when testid = 1 then datetaken else null end) as A,
  max(case when testid = 2 then datetaken else null end) as B,
  max(case when testid = 3 then datetaken else null end) as C,
  max(case when testid = 4 then datetaken else null end) as D,
  max(case when testid = 5 then datetaken else null end) as E
from users as u left join passes as p on u.userid = p.userid
group by u.userid

Оказывается, в моем реальном сценарии у меня есть две таблицы Tests (скажем, TestsX, содержащиетесты A, B и C и TestsY, содержащие тесты D и E) и две соответствующие таблицы проходов (скажем, PassesX и PassesY).

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

Может быть, это достижимо с помощью подзапроса и объединения, но я не знаю, как?

Большое спасибо (и я надеюсь, что это имеет смысл).

Ответы [ 2 ]

1 голос
/ 18 мая 2011
SELECT
  u.UserName,
  px.TestA,
  px.TestB,
  px.TestC,
  py.TestD,
  py.TestE
FROM Users u
  LEFT JOIN (
    SELECT
      UserId,
      MAX(CASE TestId WHEN 1 THEN DateTaken ELSE NULL END) AS TestA,
      MAX(CASE TestId WHEN 2 THEN DateTaken ELSE NULL END) AS TestB,
      MAX(CASE TestId WHEN 3 THEN DateTaken ELSE NULL END) AS TestC
    FROM PassesX
    GROUP BY UserId
  ) px ON u.UserId = px.UserId
  LEFT JOIN (
    SELECT
      UserId,
      MAX(CASE TestId WHEN 4 THEN DateTaken ELSE NULL END) AS TestD,
      MAX(CASE TestId WHEN 5 THEN DateTaken ELSE NULL END) AS TestE,
    FROM PassesY
    GROUP BY UserId
  ) py ON u.UserId = py.UserId
0 голосов
/ 18 мая 2011
select   u.username,   
max(case when px.testid = 1 then px.datetaken else null end) as A,   
max(case when px.testid = 2 then px.datetaken else null end) as B,   
max(case when px.testid = 3 then px.datetaken else null end) as C,   
max(case when py.testid = 4 then py.datetaken else null end) as D,   
max(case when py.testid = 5 then py.datetaken else null end) as E 
from (users as u left join passesX as px on u.userid = px.userid)
      LEFT JOIN passesY as py on u.userid = py.userid) 
group by u.userid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...