2014-03-23 4 views
0

Я запрашиваю у вас вывод, который будет получать последние данные из базы данных без каких-либо дубликатов в IMEI, я хочу, чтобы самые последние значения были видны только на выходе и будут игнорировать второй сменив значение, которое имеет тот же IMEI ..MYSQL QUERY: SELECT DISTINCT IMEI из запроса

это мой QUERY:

SELECT 
tblWeather.humidity, tblWeather.rainfall, 
tblWeather.wDate, tblWeather.wTime, 
tblStations.IMEI, tblStations.Station, 
tblWeather.IMEI, tblWeather.msgID, 
tblWeather.tempture 
FROM tblStations 
INNER JOIN tblWeather ON tblStations.IMEI = tblWeather.IMEI 
ORDER BY msgID DESC LIMIT 0,22 

выход из этого будет:

{ 
"tblStations": [ 
    { 
     "Station": "AWS09 - Lasang", 
     "Date": "2014-03-19", 
     "Time": "16:15:01", 
     "temperature": "25.2", 
     "humidity": "92.4", 
     "rainfall": "4.42" 
    }, 
    { 
     "Station": "AWS0C - AdDU", 
     "Date": "2014-03-19", 
     "Time": "16:15:01", 
     "temperature": "25.4", 
     "humidity": "88.6", 
     "rainfall": "6.2" 
    }, 
    { 
     "Station": "AWS0A - Marilog", 
     "Date": "2014-03-19", 
     "Time": "16:15:01", 
     "temperature": "22.6", 
     "humidity": "94.6", 
     "rainfall": "1.42" 
    }, 
    { 
     "Station": "AWS12 - AdDU HS", 
     "Date": "2014-03-19", 
     "Time": "16:15:01", 
     "temperature": "26", 
     "humidity": "89.5", 
     "rainfall": "4.37" 
    }, 
    { 
     "Station": "AWS0D - Lacuesta", 
     "Date": "2014-03-19", 
     "Time": "16:15:00", 
     "temperature": "18.5", 
     "humidity": "98.5", 
     "rainfall": "7.99" 
    }, 
    { 
     "Station": "AWS04 - DNSC", 
     "Date": "2014-03-19", 
     "Time": "16:15:01", 
     "temperature": "25.6", 
     "humidity": "92.7", 
     "rainfall": "2.69" 
    }, 
    { 
     "Station": "AWS14 - Catigan", 
     "Date": "2014-03-19", 
     "Time": "16:15:01", 
     "temperature": "25.4", 
     "humidity": "78.9", 
     "rainfall": "0.3" 
    }, 
    { 
     "Station": "AWS10 - Tamugan", 
     "Date": "2014-03-19", 
     "Time": "16:15:01", 
     "temperature": "25.4", 
     "humidity": "89.9", 
     "rainfall": "1.59" 
    }, 
    { 
     "Station": "AWS05 - Panacan", 
     "Date": "2014-03-19", 
     "Time": "16:15:01", 
     "temperature": "25.7", 
     "humidity": "92.9", 
     "rainfall": "2.2" 
    }, 
    { 
     "Station": "AWS03 - UPMin", 
     "Date": "2014-03-19", 
     "Time": "16:15:01", 
     "temperature": "25.9", 
     "humidity": "83.2", 
     "rainfall": "0" 
    }, 
    { 
     "Station": "AWS11 - Mudiang", 
     "Date": "2014-03-19", 
     "Time": "16:15:01", 
     "temperature": "24.9", 
     "humidity": "92.2", 
     "rainfall": "1.66" 
    }, 
    { 
     "Station": "AWS07 - Unlad Kabayan", 
     "Date": "2014-03-19", 
     "Time": "16:15:01", 
     "temperature": "26.5", 
     "humidity": "82.6", 
     "rainfall": "0.21" 
    }, 
    { 
     "Station": "AWS13 - Calinan", 
     "Date": "2014-03-19", 
     "Time": "16:15:01", 
     "temperature": "26.5", 
     "humidity": "83.9", 
     "rainfall": "0" 
    }, 
    { 
     "Station": "AWS01 - USeP", 
     "Date": "2014-03-19", 
     "Time": "16:15:01", 
     "temperature": "26.9", 
     "humidity": "86.4", 
     "rainfall": "1.63" 
    }, 
    { 
     "Station": "AWS11 - Mudiang", 
     "Date": "2014-03-19", 
     "Time": "16:00:01", 
     "temperature": "25.1", 
     "humidity": "92.2", 
     "rainfall": "1.62" 
    }, 
    { 
     "Station": "AWS0C - AdDU", 
     "Date": "2014-03-19", 
     "Time": "16:00:01", 
     "temperature": "25.3", 
     "humidity": "89.9", 
     "rainfall": "6.2" 
    }, 
    { 
     "Station": "AWS0D - Lacuesta", 
     "Date": "2014-03-19", 
     "Time": "16:00:00", 
     "temperature": "18.5", 
     "humidity": "98.4", 
     "rainfall": "7.79" 
    }, 
    { 
     "Station": "AWS03 - UPMin", 
     "Date": "2014-03-19", 
     "Time": "16:00:01", 
     "temperature": "25.7", 
     "humidity": "83.1", 
     "rainfall": "0" 
    }, 
    { 
     "Station": "AWS10 - Tamugan", 
     "Date": "2014-03-19", 
     "Time": "16:00:01", 
     "temperature": "25.3", 
     "humidity": "90", 
     "rainfall": "1.58" 
    }, 
    { 
     "Station": "AWS04 - DNSC", 
     "Date": "2014-03-19", 
     "Time": "16:00:01", 
     "temperature": "25.9", 
     "humidity": "92", 
     "rainfall": "2.66" 
    }, 
    { 
     "Station": "AWS05 - Panacan", 
     "Date": "2014-03-19", 
     "Time": "16:00:01", 
     "temperature": "25.7", 
     "humidity": "92.8", 
     "rainfall": "2.18" 
    }, 
    { 
     "Station": "AWS13 - Calinan", 
     "Date": "2014-03-19", 
     "Time": "16:00:01", 
     "temperature": "26.7", 
     "humidity": "84.5", 
     "rainfall": "0" 
    } 
], 

то, что я хочу, чтобы это получать только данные от каждой станции и не получать никаких дублированных данных от каждой станции

Станции IMEI - уникальное значение для каждой станции.

вы можете мне помочь, пожалуйста ... спасибо/..

я пытался делать отчетливый запрос, но я, кажется, не получаю никаких значений из запроса ..

+0

Это было бы очень легко сделать, если вы создали скрипт sql для меня ... так как я могу только дать общий ответ. –

+0

для получения одной записи на станцию, 'group by {station_identifier}'. Чтобы получить последнюю запись, 'sort by {time_identifier} ASC' – dognose

+0

А, но вы не можете объединить эти два метода. –

ответ

0

Похоже, вы хотите для получения сообщений от самого последнего идентификатора сообщения от каждой станции. Проблема в том, что в SQL нет супер простого способа делать такие вещи. Вам нужно будет вытащить данные во временную таблицу (либо эксплицитно, либо неявно с подзапросом), чтобы затем можно было присоединить самые последние идентификаторы для каждой станции к данным погоды.

Процесс, как это будет хорошо работать для вас:

CREATE TEMPORARY TABLE latest_messages 
SELECT MAX(msgID, IMEI) FROM tblWeather 
GROUP BY IMEI; 

Преимущество сдачи его в явном временную таблицу, что вы можете индекс этой таблицы для последующего соединения, метод, который только действительно имеет значение, если latest_messages становится довольно большим. Соединение с подзапросом, вероятно, будет адекватным. Если данные слишком велики для обеих этих методов, тогда вам, вероятно, понадобится триггер или ручной метод для обновления latest_messages всякий раз, когда произойдет обновление.

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

Если вы не можете или не хотите, чтобы создать временную таблицу, вы можете попробовать что-то вроде этого:

select * from (
    SELECT MAX(msgID, IMEI) newest_id FROM tblWeather 
    GROUP BY IMEI 
    ) AS most_recent_messages 
    JOIN tblWeather on newest_id = tblWeather.msgID 
    JOIN tblStations on tblStations.IMEI = tblWeather.IMEI; 

Надеется, что это помогает! Создайте SQLFiddle, если вам нужен более конкретный пример. Я устаю восстановление схемы людей :)

+0

спасибо за предложение, но у меня действительно нет этой опции, так как я только подключаюсь к файлу PHP, и у меня ограниченный доступ к базе данных .. я не могу создать там, я могу только SELECT .. osrry для того, чтобы не помещать это ... – Adrian

+0

Вы все еще можете сделать это с помощью подзапроса. Взгляните на редактирование, которое я только что добавил. –

0

Вы можете отсортировать записи по дате первыми, затем группа любого {station_identifier} - вуаля, у вас есть последняя запись на каждую станцию:

SELECT * FROM (SELECT * FROM entries ORDER BY c_time DESC) as temp GROUP BY station; 

См скрипка: http://sqlfiddle.com/#!2/b8a28/1

Возможно, мой комментарий был немного неясным: из. в течение одного запроса, который не работает (без min/max). Но вам не нужно возиться с Min/Max или любым другим, чтобы получить самую новую запись за «блок группировки».

Sitenote: на MsSQL это не сработает: Mysql выберет «первый» результат в случае неоднозначной группировки без определения агрегации на других столбцах (что определено нашей сортировкой, сделанной ранее) - MsSQL выдаст ошибку ,


объяснение:

Предполагая Ряды

foreign_id | date | msg 
1 | 2014-03-23 00:00:00 | Newest Message 
1 | 2014-03-22 00:00:00 | Older Message 

Mysql сортирует их как данность. Наконец, он будет группироваться по id и выбирать первую строку из-за группировки (и первая строка каждой группы - это то, что нам нужно - из-за сортировки): 2014-03-23 00:00:00 и Newest Message.

на MsSQL, вы должны дать MAX(date), которые затем будут Клири определить 1 | 2014-03-23 00:00:00 - Тем не менее, MsSQL не будет знать, что делать с колонкой сбщ: Должен ли он выбрать Newest Message или Older Message? Это связано с отсутствием столбца Aggregation on THAT, и MsSQL не имеет неявной сортировки по этому поводу, потому что значения BOTH соответствуют критериям Group By id=1.

+0

Что означает код «как темп»? – Adrian

+0

@Adrian это просто определяет SubSelect как временную таблицу. Для более сложных запросов вы можете обратиться к каждому столбцу этого подзапроса с именем temp.columnName. Даже если вам это не нужно, псевдоним является обязательным для подзапросов. – dognose