Выберите самые последние строки для каждого идентификатора

#mysql

#mysql

Вопрос:

Ниже у меня есть две таблицы, одна из которых является основной таблицей, а вторая — таблицей сведений. Мне нужны самые последние строки из таблицы details , если в таблице details нет сведений для соответствующей строки, то в ней должны отображаться пустые строки и информация главной таблицы для этого идентификатора.

Я использовал приведенный ниже запрос, но он не дает желаемого результата

 select st.Station_Id,st.id,st.StationType,st.stationname,st.Latitude,st.Longitude, max  (pump.LastUpdate)
  

как LastUpdate,pump.daily_abstraction,pump.water_level из sgwebdb.stations как st
левое внешнее соединение sgwebdb.pump_station_data как pump на st.station_id = pump.station_id
где st.Дата удаления равна нулю, а st.stationtype = ‘насосная станция’
группируйте по st.station_id;

Главная таблица- станции

ИДЕНТИФИКАТОР Station_ID Тип станции Название станции Широта Долгота

1 Pump0 Насосная станция ABC 5.555 100.4578 2 Pump1 Насосная станция DEF 5.555 100.4578 3 Pump2 Насосная станция GHI 5.555 100.4578 4 Pump3 Насосная станция JKL 5.555 100.4578 5 Pump4 Насосная станция MNO 5.555 100.4578 6 Pump5 Насосная станция PQR 5.555 100.4578 7 Pump6 Насосная станция STU 5.555 100.4578 8 Pump7 Насосная станция VXY 5.555 100.4578 9 Насосная станция Pump8 ZAB 5.555 100.4578 10 Насосная станция Pump9 CDE 5.555 100.4578 11 Насосная станция Pump10 FGH 5.555 100.4578 12 Насосная станция Pump11 IJK 5.555 100.4578 13 Насосная станция Pump12 LMN 5.555 100.4578 14 Насосная станция Pump13 OPR 5.555 100.4578 15 Насосная станция Pump14 QST 5.555 100.4578 16 Насосная станция Pump15 UVW 5.555 100.4578

Имя подробной таблицы: pump_station_data`

 id    Station_id    lastupdate      hrl_abst daily_abst Water_Level
3   Pump15  2014-05-13 12:45:00 23  45      8
4   Pump0   2014-05-20 01:01:00 1   1       1
5   Pump0   2014-07-02 12:00:00 15.41   15.41       51.95
6   Pump0   2014-07-03 12:00:00 0.9 21.6        26.65
7   Pump1   2014-07-03 01:30:00 0   0       21.69
8   Pump0   2014-07-05 09:20:00 20  20      26.7535
9   Pump1   2014-07-05 11:25:00 20  20      21.69
10  Pump2   2014-07-05 15:10:00 20  20      9.4287
11  Pump3   2014-07-05 15:45:00 20  20      6.2608
12  Pump4   2014-07-05 13:25:00 20  20      2.2636
13  Pump5   2014-07-05 16:31:00 20  20      2.2832
14  Pump6   2014-07-05 16:38:00 20  20      2.1249
15  Pump7   2014-07-05 17:35:00 20  20      10
16  Pump8   2014-07-05 17:35:00 20  20      10
17  Pump9   2014-07-05 19:36:00 20  20      2.0994
18  Pump10  2014-07-05 19:55:00 20  20      2.112
19  Pump11  2014-07-05 20:15:00 20  20      2.1054
20  Pump12  2014-07-05 19:45:00 20  20      2.099
21  Pump13  2014-07-05 18:45:00 20  20      2.0994
22  Pump14  2014-07-05 16:45:00 20  20      10
23  Pump15  2014-07-05 16:45:00 20  20      2.1234
24  Pump16  2014-07-05 19:45:00 20  20      10
25  Pump17  2014-07-05 18:25:00 20  20      52.5678
26  Pump18  2014-07-05 18:50:00 20  20      42.0116
27  Pump19  2014-07-05 14:20:00 20  20      10
  

Комментарии:

1. Пожалуйста, научитесь редактировать вопросы в хорошем формате, чтобы больше людей захотели на них ответить, формат, используемый stackoverflow, беден, но прост в использовании.

2. @flybird Я обработал это правильно, но после отправки весь формат исчез, и он пришел в странном формате.

3. иногда я думаю, что stackoverflow тоже мог бы улучшить редактор.

4. @flybird да, абсолютно верно, этот редактор создает много проблем….

Ответ №1:

Попробуйте этот sql:

 select * from pump_station_data
where id in  (
    select max(id) from pump_station_data group by Station_id
)
order by Station_id;
  

Для вашего второго запроса попробуйте это:
Я предполагаю, что ваша основная таблица называется «station», имя столбца идентификатора станции в этой таблице — «Station_id»,

 select psd.*, st.Station_id from pump_station_data as psd
right join station as st
on psd.Station_id = st.Station_id
where psd.id in  (
    select max(id) from pump_station_data group by Station_id
)
order by st.Station_id;
  

Комментарии:

1. спасибо, что запрос работает. мне нужно еще кое-что, у меня есть одна главная таблица для станции, откуда мне нужно присоединиться к запросу. в основном это главная таблица для станций. итак, если какая-либо насосная станция не имеет значения в приведенной выше таблице, то она возьмет основные сведения из таблицы станций и покажет пустые строки. можем ли мы это сделать?

2. @vim Да, я так думаю, вы можете сделать это с помощью sql или с помощью программы, если с помощью sql проверить обновленный ответ, основная идея заключается в использовании right join, который выберет любую строку в нужной табличной станции.

3. выдает ошибку рядом с ключевым словом «right». говорит, что неожиданно правильно и ожидает END_OF_Input

4. @vim какую базу данных вы используете?

5. @Vim моя ошибка, предложение join должно быть перед предложением where, попробуйте обновленный sql.