#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.