Получить результат из объединенных таблиц - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть 2 таблицы:

Таблица 1:

| jobid | jobname |
|     1 | job a   |
|     2 | job b   |

Таблица 2:

| id | jobid | statusid | statusdate          | desc   |
|  1 |     1 |      100 | 2019.04.25 10:00:00 | first  |
|  2 |     2 |      100 | 2019.04.25 11:00:00 | first  |
|  3 |     2 |      100 | 2019.04.25 12:00:00 | second |

Задания в таблице2 могут иметь более одного «statusid», но разные «statusdate» и «desc»

Мне нужно получить список вакансий с последним «statusid» = 100, например:

| 1 | job a | 1 | 1 | 100 | 2019.04.25 10:00:00 | first  |
| 2 | job b | 3 | 2 | 100 | 2019.04.25 12:00:00 | second |
SELECT * FROM table1
INNER JOIN table2 ON table1.id = table2.jobid
GROUP BY table1.id

Этот запрос возвращает неправильный результат, например:

| 1 | job a | 1 | 1 |   | 100 | 2019.04.25 10:00:00 | first |
| 2 | job b | 3 | 2 | 2 | 100 | 2019.04.25 11:00:00 | first |

Ответы [ 3 ]

0 голосов
/ 25 апреля 2019
SELECT
  t1.*,t2.* FROM
  (SELECT
    MAX(id) as id
  FROM
    table2
  WHERE statusid = 100
  GROUP BY jobid) AS f
  JOIN table2 t2
    ON t2.id = f.id
  JOIN table1 t1
    ON t2.jobid = t1.jobid

Выбранный подзапрос находит последний идентификатор для строки с statusid 100, затем он присоединяется к фактической таблице на основе этого идентификатора.

Вы можете изменить порядок, если хотите, используя правильные объединения.

0 голосов
/ 25 апреля 2019
DROP TABLE IF EXISTS table1;

CREATE TABLE table1
(jobid INT NOT NULL PRIMARY KEY
,jobname VARCHAR(12) UNIQUE
);

INSERT INTO table1 VALUES
(1,'job a'),
(2,'job b'),
(3,'job c');

DROP TABLE IF EXISTS table2;

CREATE TABLE table2
(id SERIAL PRIMARY KEY
,jobid INT NOT NULL
,statusid INT NOT NULL
,statusdate DATETIME NOT NULL
,description VARCHAR(12) NOT NULL
);

INSERT INTO table2 VALUES
(1,1,100,'2019-04-25 10:00:00','first'),
(2,2,100,'2019-04-25 11:00:00','first'),
(3,2,100,'2019-04-25 12:00:00','second');

SELECT a.*
     , b.id x_id
     , b.statusid
     , b.statusdate
     , b.description 
  FROM table1 a 
  LEFT 
  JOIN 
     ( SELECT x.* 
         FROM table2 x
         JOIN 
            ( SELECT MAX(id) id 
                FROM table2 
               WHERE statusid = 100 
               GROUP 
                  BY jobid
            ) y 
           ON y.id = x.id
     ) b
    ON b.jobid = a.jobid 
;


+-------+---------+------+----------+---------------------+-------------+
| jobid | jobname | x_id | statusid | statusdate          | description |
+-------+---------+------+----------+---------------------+-------------+
|     1 | job a   |    1 |      100 | 2019-04-25 10:00:00 | first       |
|     2 | job b   |    3 |      100 | 2019-04-25 12:00:00 | second      |
|     3 | job c   | NULL |     NULL | NULL                | NULL        |
+-------+---------+------+----------+---------------------+-------------+
0 голосов
/ 25 апреля 2019

Вы должны быть в состоянии сделать это, выполнив что-то вроде этого:

Таблица

drop table if exists table1;
create table table1 (jobid int, jobname char(10));
insert into table1 values (1, 'job a'), (2, 'job b');

drop table if exists table2;
create table table2 (
    id int,
    jobid int,
    statusid int,
    statusdate timestamp,
    `desc` char(10)
);
insert into table2 values
(1,1,100,'2019.04.25 10:00:00','first')
,(2,2,100,'2019.04.25 11:00:00','first')
,(3,2,100,'2019.04.25 12:00:00','second');

Запрос

select
    t1.*,
    t2.*
from table1 t1
inner join (
    select jobid, max(statusdate) as maxstatusdate
    from table2
    group by jobid
) tn on t1.jobid = tn.jobid
inner join table2 t2 on tn.jobid = t2.jobid and tn.maxstatusdate = t2.statusdate;

* Результаты 1014 ** * 1015 jobid jobname id jobid statusid statusdate desc 1 job a 1 1 100 25.04.2019 10:00:00 first 2 job b 3 2 100 25.04.2019 12:00:00 second Объяснение

  • Для каждого идентификатора задания найдите максимальную дату статуса
  • Присоедините это к таблице1, чтобы получить информацию из таблицы1. Общее поле - jobid
  • Присоедините их результат к таблице 2, в которой есть вся остальная информация, которую вы хотите. Общие поля - это jobid и statusdate. Поскольку мы присвоили максимальную дату статуса другому имени, убедитесь, что мы используем правильное имя в соединении

Пример: https://rextester.com/HRSWZ89705

...