Задавайте вопросы, мы ответим
Вы не зашли.
Есть таблица поля N(float),E(float) - это координаты широта, долгота.
Необходимо определить пройденный путь, т.е. точку ((N1-N0)в квадрате + (E1-E0)в квадрате)из всего этого извлекаем корень, т.е. получаем гипотенузу - расстояние + тоже самое но для точек E1,E2,N1,N2 и т.д. соответственно group by date. Спасибо.
Вот пример таблицы
N E V time date
6055,6158 7635,3448 8,37 01:58:45 26.3.2008
6055,5918 7635,3271 1,16 01:59:14 26.3.2008
6055,6488 7635,0718 24,06 01:59:45 26.3.2008
6055,6652 7635,009 0,22 02:00:15 26.3.2008
6055,7758 7635,1027 33,4 02:00:45 26.3.2008
6056,0301 7635,3751 30,41 02:01:15 26.3.2008
6056,0983 7635,3962 12,54 02:01:44 26.3.2008
6056,1721 7635,0806 25,16 02:02:15 26.3.2008
6056,2663 7634,7016 32,2 02:02:45 26.3.2008
6056,383 7634,2131 31,68 02:03:15 26.3.2008
6056,3917 7634,0426 0,09 02:03:45 26.3.2008
6056,4995 7634,0017 30,33 02:04:15 26.3.2008
6056,7174 7633,9876 1,69 02:04:45 26.3.2008
6056,723 7633,9866 10,16 02:05:15 26.3.2008
6056,9343 7633,848 30,09 02:05:45 26.3.2008
6057,0804 7633,6895 16,68 02:06:15 26.3.2008
6057,2065 7633,55 17,82 02:06:45 26.3.2008
6057,2166 7633,3815 19,78 02:07:15 26.3.2008
6057,177 7633,2608 0,11 02:07:45 26.3.2008
6057,1766 7633,2619 0,08 02:08:16 26.3.2008
6057,1765 7633,2625 0,02 02:08:46 26.3.2008
6057,1762 7633,2632 0,04 02:09:15 26.3.2008
6057,182 7633,2537 7,42 02:09:45 26.3.2008
6057,1599 7632,9938 19,44 02:10:15 26.3.2008
6057,0673 7632,864 17,96 02:10:45 26.3.2008
6056,9981 7632,8603 9,56 02:11:15 26.3.2008
6056,9294 7632,8609 0,1 02:11:45 26.3.2008
6056,9117 7632,5609 27,05 02:12:15 26.3.2008
6056,9033 7632,1646 20,06 02:12:45 26.3.2008
6056,8985 7631,9141 9,97 02:13:11 26.3.2008
Неактивен
Если нужно расстояние за день, то надо воспользовать аггрегирующей функцией SUM()
SELECT SUM( sqrt((N1-N0)*(N1-N0)+ (E1-E0)*(E1-E0)) ) FROM таблица GROUP BY date;
Неактивен
Да но как обозначить в запросе точки N1,N2,N3 и т.д. есть поле n как запросе обозначить расст(n1-n0, e1-e0) + расст(n2-n1,e2-e1) +...... расст(nk - n (k-1),ek - e (k-1)). В вашем запросе фигурирует только n0 и n1, может я неправильно вопрос задал.
Неактивен
Ясно, у Вас в таблице только одна координата. Предлагаю усовершенствовать таблицу, чтобы в ней хранились не точки, а отрезки:
ALTER TABLE таблица ADD N1 FLOAT;
UPDATE таблица t1 SET N1 = IFNULL( (SELECT N FROM таблица t2 WHERE t2.date=t1.date and t2.time>t1.time ORDER BY t2.time ASC LIMIT 1), t1.N)
В N1 запишется координата следующей точки, а если последняя за день (IFNULL), то та же координата.
Аналогично создайте E1. Затем запрос, который выше, но N вместо N0. В принципе подзапрос можно втиснуть и в запрос, который приведен выше.
Неактивен
Слабоват я в этих тонкостях. Точки мне необходимо хранить в том виде как они есть. В таблице на верху, есть два столбца N и E берем
первую запись N0=6055,6158 E0=7635,3448 вычитаем из нее вторую E1=6055,5918 N1=7635,3271 (вычет соответственно E0-E1 и N0-N1 или наоборот не суть важно квадрат знак уничтожит), получается соответственно E0-E1=6055,6158-6055,5918=0,024 N0-N1=7635,3448 - 7635,3271 =0,0177, возводим разности в квадраты складываем их и извлекаем из них корень, далее проделываем тоже самое для N2,N1 и E2,E1 и складываем с предыдущим отрезком и так до конца таблицы, т.е. груп бай дэйт
Неактивен
в MySQL нельзя выполнять операции над числами из разных строк. GROUP BY также оперирует строками.
Либо изменяете структуру таблицы, хотя бы на время расчетов, либо используете подзапрос для получение координаты следующей точки.
Неактивен
SELECT SUM( sqrt( POW(N1-N, 2) + POW(E1-E, 2) ) ) FROM таблица t1 GROUP BY date;
в запрос выше вместо N1 подставляете IFNULL(SELECT N FROM таблица t2 WHERE t2.date=t1.date AND t2.time>t1.time ORDER BY t2.time LIMIT 1), t1.N), вместо E1 подставляете IFNULL(SELECT E FROM таблица t2 WHERE t2.date=t1.date AND t2.time>t1.time ORDER BY t2.time LIMIT 1), t1.E)
Неактивен
Хорошо, а Вы бы не могли накидать как приблизно это будет выглядеть
Неактивен
SELECT SUM( sqrt( POW(
IFNULL(SELECT N FROM таблица t2 WHERE t2.date=t1.date AND t2.time>t1.time ORDER BY t2.time LIMIT 1)
-N, 2) + POW(
IFNULL(SELECT E FROM таблица t2 WHERE t2.date=t1.date AND t2.time>t1.time ORDER BY t2.time LIMIT 1), t1.E)
-E, 2) ) ) FROM таблица t1 GROUP BY date;
Слово таблица замените на название Вашей таблицы
Неактивен
Спасибо, подскажите, возможно ли чтобы сервер баз данных проделывал сам такую операцию скажем каждые N минут и держал эту циферку где нибудь в другой таблице, или же целесообразнее это делать один раз при запросе. Я исхожу из того что если строк будет слишком много скажем тысяч 30-40, сколько это может занять времени.
Неактивен
Можно, например
DROP TABLE IF EXISTS new_table
CREATE TABLE new_table SELECT ... далее запрос
и выпоонять это по cron
Проще поменять структуру таблицы, пост #4
Неактивен
Вот только понять не могу в запросе две таблицы а у меня одна, если поставить одну и ту же таблицу то абра кадабра выходит, как отлчить две даты и времени
Неактивен
Если Вы про длинный запрос, то он должен работать, если Вы укажете одну и ту же таблицу. Дело в том, что таблица в подзапросе видна только в пределах данного подзапроса, а внутри этого подзапроса различение происходит с помощью алиасов t1 и t2
Неактивен
Выдал нолики, правда 9 строк как и количесвто дат, как алиасы назначить
Неактивен
Алиасы уже назначены Это слова t1 и t2 после имени таблицы
Вот так, правильно
SELECT SUM( sqrt( POW(
IFNULL((SELECT N FROM таблица t2 WHERE t2.date=t1.date AND t2.time>t1.time ORDER BY t2.time LIMIT 1), t1.N)
-N, 2) + POW(
IFNULL((SELECT E FROM таблица t2 WHERE t2.date=t1.date AND t2.time>t1.time ORDER BY t2.time LIMIT 1), t1.E)
-E, 2) ) ) FROM таблица t1 GROUP BY date;
Неактивен
Трындец запрос занял секунд 7-8 это при 1440 строк, а штука строк это можно чай попить
Неактивен
Спасибо, но я тут по незнанию ни праймари кейс ни индексы не использую, может из-за этого так долго
Неактивен
добавьте ключ на поле time и на поле date
ALTER TABLE имя_таблицы ADD KEY(time), ADD KEY(date)
Неактивен