2015-05-12 4 views
1

Table structureКак мне группировать 2 столбца, чтобы получить самую последнюю версию уникальной строки?

Наверху является частью вывода, я пытаюсь получить только последнюю комбинацию FID и SID. т.е. FID: 1, SID: 1

Это мой текущий SQL

SELECT * FROM sensors, Location_polygon s_lp WHERE username = '$username' 
ORDER BY Datetime DESC; 

Группировка по FID и SID оказывает неожиданный результат просто показывает все строки, где FID = 1 и SID = 1.

У кого-нибудь есть идеи?

Мой ожидаемый результат:

Expected Results

Существующая структура таблицы с примером данных: таблица 'датчиков'

  • [FID] => 9
  • [SID] = > 1
  • [Datetime] => 2015-05-04 00:00:00
  • [SENSOR1] => 1000
  • [sensor2] => 100
  • [Sensor3] => 100
  • [Батарея] => 10

стол 'Location_polygon'

  • [имя пользователя] => Judy
  • [FID] => 1
  • [SID] => 1
  • [LAT1] => 31,446376
  • [long1] => -83,597959
  • [LAT2] => 31,443103
  • [long2] => -83,598051
  • [lat3] => 31,442641
  • [long3 ] => -83,594875
  • [лат4] => 31,44486
  • [long4] => -83,594595
  • [lat5] => 31,446385
  • [long5] => -83.596625
  • [тип] => SAND
+1

Нет JOIN состояние? Каковы определения таблиц для датчиков и Location_polygon? – jarlh

+0

Каков ваш ожидаемый результат, добавьте их в вопрос из данных образца. –

+0

Пожалуйста, добавьте свое определение таблицы и данные образца – tarzanbappa

ответ

1

Я не уверен, что это лучший способ выполнить эту задачу, но вы можете попробовать.

SELECT * 
FROM sensors s 
JOIN Location_polygon s_lp 
    ON s.FID = s_lp.FID and s.SID = s_lp.SID 
WHERE username = '$username' and Datetime = (
    SELECT max(Datetime) FROM sensors) 

Моя точка зрения: если вы хотите выбрать только последние комбинации, вам нужно получить последнюю дату. Это можно сделать с помощью подзапроса. Также мы можем использовать INNER JOIN по FID и SID, например, @Abhik Chakraborty выше, что устраняет декартовы и повторения.

+0

Я понимаю, что вы пытаетесь сделать, и я пробовал это сам, но это дает мне следующее предупреждение. Предупреждение: mysqli_fetch_assoc() ожидает, что параметр 1 будет mysqli_result, boolean given – Jebzaki

+0

@Jebzaki добавить некоторые изменения в ответ. INNER JOIN от Abhik Chakraborty ответ может удалить повторения, если пара (FID, SID) уникальна. – hr6134

+0

Ваш отредактированный код действительно работал, так как ожидал, что он дал мне комбинации 1,3 и 1,1, но странно не 1,2, но большое спасибо, это отличная отправная точка для окончательного решения для меня. – Jebzaki

3

Вы можете получить желаемый набор с помощью

select s_lp.* from Location_polygon s_lp 
join(
select fid,sid,max(time_taken) as time_taken from Location_polygon 
group by fid,sid 
)x 
on x.fid = s_lp.fid and x.sid=s_lp.sid and x.time_taken = s_lp.time_taken 

Если у вас есть некоторые дополнительные, где условие добавить их в конце относительно первого псевдонима s_lp что-то в where s_lp.col_name = {some condition}

UPDATE: Из комментария это, кажется, есть 2 таблицы и дата в другой таблице, поэтому запрос будет

select s_lp.* from sensors s 
join(
select fid,sid,max(Datetime) as Datetime from sensors 
group by fid,sid 
)x 
on x.fid = s.fid and x.sid=s.sid and x.Datetime = s.Datetime 
join Location_polygon s_lp on s_lp.fid = s.fid and s_lp.sid = s.sid 
WHERE s_lp.username = '$username' 
+0

Я добавил структуру таблицы выше, которая должна помочь бит – Jebzaki

+0

Небольшая коррекция в вашем обновлении «выберите s. * Sensor s ...» Это также работает, спасибо за ваше время. – Jebzaki

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