2016-06-14 2 views
0

У меня возникают трудности с извлечением самой последней записи из таблицы истории. Я просто работаю над одной частью извлечения на данный момент. Финал станет объединением последней записи истории с таблицей клиентов.медленный запрос, получающий самую последнюю запись

В таблице клиентов:

CREATE TABLE Clients 
(
     id      int(8) auto_increment not null primary key, 
     LastName    varchar(50), 
     First     varchar(50), 
     CanContact    TINYINT(1) 
); 

Клиент История (~ 300.000 записей):

CREATE TABLE ClientHistory 
(
     id      int(8) auto_increment not null primary key, 
     Client     int(8), 
     Act_Date    datetime, 
     Activity    int(8) 
); 
create index idx_ClientHistory_Client on ClientHistory(Client); 
create index idx_ClientHistory_Act_Date on ClientHistory(Act_Date); 

Вопрос 1: SELECT id, MAX(Act_Date), Notes from ClientHistory group by Client. Это извлекает самую последнюю дату, но идентификаторы и заметки фактически взяты из самой старой записи.

mysql> select id, Client, Act_Date, Activity from ClientHistory where client=18176; 
+--------+--------+---------------------+----------+ 
| id  | Client | Act_Date   | Activity | 
+--------+--------+---------------------+----------+ 
| 346725 | 18176 | 2015-09-04 09:29:35 |  4 | 
| 346726 | 18176 | 2015-09-04 09:29:39 |  3 | 
| 346727 | 18176 | 2015-09-04 09:44:29 |  4 | 
| 346728 | 18176 | 2015-09-04 09:44:36 |  3 | 
| 346737 | 18176 | 2015-09-04 10:35:10 |  4 | 
| 346739 | 18176 | 2015-09-04 10:49:43 |  4 | 
| 346740 | 18176 | 2015-09-04 10:54:57 |  29 | 
| 346787 | 18176 | 2015-09-04 15:37:15 |  23 | 
| 346788 | 18176 | 2015-09-04 15:37:20 |  23 | 
| 346789 | 18176 | 2015-09-04 15:37:23 |  23 | 
| 346790 | 18176 | 2015-09-04 15:37:27 |  23 | 
| 346791 | 18176 | 2015-09-04 15:37:30 |  23 | 
| 346792 | 18176 | 2015-09-04 15:37:34 |  20 | 
| 346793 | 18176 | 2015-09-04 15:37:51 |  13 | 
| 346798 | 18176 | 2015-09-04 15:50:51 |  25 | 
| 346808 | 18176 | 2015-09-04 16:10:55 |  13 | 
+--------+--------+---------------------+----------+ 
16 rows in set (0.00 sec) 

mysql> select id, Client, Act_Date, MAX(Act_Date), Activity from ClientHistory where client=18176; 
+--------+--------+---------------------+---------------------+----------+ 
| id  | Client | Act_Date   | MAX(Act_Date)  | Activity | 
+--------+--------+---------------------+---------------------+----------+ 
| 346725 | 18176 | 2015-09-04 09:29:35 | 2015-09-04 16:10:55 |  4 | 
+--------+--------+---------------------+---------------------+----------+ 
1 row in set (0.00 sec) 

mysql> select id, Client, Act_Date, Activity from ClientHistory where client=18176 group by Client order by Act_Date desc; 
+--------+--------+---------------------+----------+ 
| id  | Client | Act_Date   | Activity | 
+--------+--------+---------------------+----------+ 
| 346725 | 18176 | 2015-09-04 09:29:35 |  4 | 
+--------+--------+---------------------+----------+ 
1 row in set (0.00 sec) 

Вопрос 2 ниже запрос безумно медленно (~ 6 секунд):

select * from Clients 
LEFT JOIN ( 
    select c1.* from ClientHistory as c1 
     LEFT JOIN ClientHistory as c2 on c1.client = c2.client and c1.Act_Date < c2.Act_Date where c2.Client is null 
     ) as ctemp on Clients.id = ctemp.Client 
     where CanContact=true order by LastName, First; 

виновный:

select c1.* from ClientHistory as c1 
     LEFT JOIN ClientHistory as c2 on c1.client = c2.client and c1.Act_Date < c2.Act_Date where c2.Client is null; 
And the explain: 
explain select c1.* from ClientHistory as c1 LEFT JOIN ClientHistory as c2 on c1.client = c2.client and c1.Act_Date < c2.Act_Date where c2.Client is null; 
+----+-------------+-------+------+-----------------------------------------------------+--------------------------+---------+-----------+--------+-------------+ 
| id | select_type | table | type | possible_keys          | key      | key_len | ref  | rows | Extra  | 
+----+-------------+-------+------+-----------------------------------------------------+--------------------------+---------+-----------+--------+-------------+ 
| 1 | SIMPLE  | c1 | ALL | NULL            | NULL      | NULL | NULL  | 330120 | NULL  | 
| 1 | SIMPLE  | c2 | ref | idx_ClientHistory_Client,idx_ClientHistory_Act_Date | idx_ClientHistory_Client | 5  | c1.Client |  8 | Using where | 
+----+-------------+-------+------+-----------------------------------------------------+--------------------------+---------+-----------+--------+-------------+ 
2 rows in set (0.00 sec) 

Я совершенно сбит с толку.

ответ

0

Ответ на вопрос 1:

SELECT id, MAX(Act_Date), Notes from ClientHistory group by Client 

Не ANSI совместимый. Вы должны перечислить все свои столбцы, у которых нет функции, примененной к вам. GROUP BY статья

В этом случае возможно, что это возвращает более 1 запись, поскольку MAX (Act_Date) может быть кратным для одного клиента , Если это не так, для ваших данных, вы можете использовать:

SELECT Client,MAX(id), MAX(Act_Date) from ClientHistory group by Client 

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

+0

FYI, с направлением, это текущий запрос, который возвращает в .45 секунд выберите * от клиентов осталось присоединиться ( \t SELECT, т. *, Notes, Activity, Act_Date from ClientHistory \t \t INNER JOIN (выберите MAX (Act_date), MAX (id) в середине, Клиент из группы ClientHistory от клиента) как t на t.mid = ClientHistory.id) в качестве ch на Client = Клиенты .id ; – user438431

0

Вы можете сделать где в и присоединиться

SELECT * from ClientHistory 
where (Act_Date, client) in (select MAX(Act_Date), client) 
    from ClientHistory group by Client) 
inner join client on client.id = ClientHistory .client; 
+0

этот запрос без внутреннего соединения никогда не завершался. Он закончился через 600 секунд. – user438431

+0

Произошла ошибка. У меня есть ответ на вопрос ... дайте мне знать неправильную пару act_date, клиент .. внутри предложения in ... тогда не совпадают – scaisEdge

+0

нормально, это намного лучше. и ваш ответ, и тот, что у Норберта, похоже, работают – user438431

Смежные вопросы