MySQL INNER JOIN Пустые строки с подзапросами и максимальной датой - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть 3 таблицы, связанные по коду, например:

enter image description here

Я хочу получить результат из 3 связанных таблиц, сгруппировав повторяющиеся строкисогласно дате обновления регистра.Я пытался это присоединиться к ним

SELECT
    stu.code,
    stu.name,
    stu.lastname,
    adr.address, 
    adr.phone,
    adr.register_date,
    uni.university,
    uni.degree,
    uni.register_date

FROM student stu

INNER JOIN 
    address adr
    ON adr.code = stu.code

INNER JOIN (
    SELECT code, MAX(register_date) reg_date
    FROM address
    GROUP BY code
) max_address
ON max_address.code = adr.code
AND max_address.reg_date = adr.register_date    

LEFT JOIN
    university uni
    ON uni.code = stu.code

LEFT JOIN (
    SELECT code, MAX(register_date) reg_date
    FROM university
    GROUP BY code
) max_uni
ON max_uni.code = uni.code
AND max_uni.reg_date = uni.register_date

Этот код возвращает ...

enter image description here

Я просто хочу вернуть строкис максимальной датой регистрации (таблицы адресов и университетов) на одного учащегося, которая будет с красными стрелками. Как я могу это сделать, даже если у некоторых студентов нет строки в университетской таблице?

КакВы можете видеть, что это происходит с "Брэндоном Уолкером", в университетской таблице нет кода 854, и он отображает NULL в этих полях, но не группируется по записям Оливии и Джона, потому что я использую LEFT JOINдля того, чтобы принести эти «пустые» записи от Брэндона.

Если я использую INNER JOIN, он вообще не получит регистр Брэндона Уокера

INNER JOIN
    university uni
    ON uni.code = stu.code

INNER JOIN (
    SELECT code, MAX(register_date) reg_date
    FROM university
    GROUP BY code
) max_uni
ON max_uni.code = uni.code
AND max_uni.reg_date = uni.register_date

enter image description here

Если быть более точным, я хочу вернуть это в своем запросе

enter image description here

Любое предложение о том, как этого добиться

1 Ответ

0 голосов
/ 19 февраля 2019

GROUP BY не очень помогает, когда вам нужно сохранить ассоциации строк после нахождения значения MAX() для конкретного учащегося.

Что логично мне приходит в голову, потому что таблица учеников содержит уникальныекоды учеников - это выбор данных учеников, а затем выполнение подзапросов в таблицах address и university, чтобы изолировать одну строку с самой последней register_date перед присоединением влево (что позволит присоединить null строк) кstudent таблица.

SQL ( Демонстрация )

SELECT
    a.code,
    a.name,
    a.lastname,
    b.address,
    b.phone,
    b.register_date AS addr_date,
    c.university,
    c.degree,
    c.register_date AS uni_date
FROM student a
LEFT JOIN (
  SELECT code, address, phone, register_date
  FROM address sub_b
  WHERE register_date = (
      SELECT MAX(register_date)
      FROM address
      WHERE code = sub_b.code
  )) b ON a.code = b.code
LEFT JOIN (
  SELECT code, university, degree, register_date
  FROM university sub_c
  WHERE register_date = (
      SELECT MAX(register_date)
      FROM university
      WHERE code = sub_c.code
  )) c ON a.code = c.code
ORDER BY a.code

Вывод:

| code | name    | lastname | address | phone | addr_date           | university | degree | uni_date            |
| ---- | ------- | -------- | ------- | ----- | ------------------- | ---------- | ------ | ------------------- |
| 853  | John    | White    | craFtur | 315   | 2016-10-10 07:00:01 | Bristol    | 145    | 2011-02-19 00:00:00 |
| 854  | Brandon | Walker   | cra 101 | 313   | 2005-11-04 06:00:00 | NULL       | NULL   | NULL                |
| 855  | Olivia  | Wright   | cll 26D | 310   | 2012-05-06 07:00:00 | Stanford   | 10025  | 2010-01-07 00:00:00 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...