въпрос за select

8 отговора 731 прегледа
#1

въпрос за select

имам следният въпрос
значи за дандено ip във една таблица има да речем 22 записа как мога да селектна последният запис за това ип

Отговор
в отговор на til #2

Re: проста работа

Само дефинирай какво имаш предвид "последния запис"

salle.online.bg/sig
Отговор
в отговор на salle #3

Re: проста работа

Еми случаят е следният имам една таблица с две полета:
в едното се записва дата и време под формата на unix timestamp а във другото ip номера и да речем че за период от два часа да речем от 00:00:00 до 02:00:00
дадено ип се среща няколко пъти да речем 6 пъти аз искам да изкарам последният шести път и да взема времето

Отговор
в отговор на til #4

Re: Е така вече е по-лесно нали?

"в едното се записва дата и време под формата на unix timestamp ... за период от два часа да речем от 00:00:00 до 02:00:00 дадено ип се среща няколко пъти да речем 6 пъти аз искам да изкарам последният"

т.е. искаш да изкараш реда за който ip е еди какво си и timestamp е най-голямо?

Виждаш ли как същото нещо казано по друг начин може да се преведе на SQL

Сега ако каже и за каква СУБД иде реч ще се намери някой да ти предложи оптимално решение.

За MySQL:
SELECT ... WHERE ip = '192.168.1.1' ORDER BY ts DESC LIMIT 1;

salle.online.bg/sig
Отговор
в отговор на salle #5

Re: Е така вече е по-лесно нали?

А защо не с агрегат?

SELECT ... MAX(ts) AS maxTS ... WHERE ... GROUP BY ip;

Само питам.

Има три вида хора. Част от проблема, част от решението и част от пейзажа.
Отговор
в отговор на mr.vain #6

Re: Е така вече е по-лесно нали?

За такава заявка няма смисъл от агрегат. GROUP BY най вероятно ще направи темп таблица в паметта, което за един ред е излишно. Освен това limit е оптимизиран доста добре пък ако има и индекс на датата и IP-то MySQL ще прочете от диска само реда който му трябва, останалото ще го вземе от индекса който при нормални настройки е вече зареден в паметта. Скороста на изпълнение ще е с пъти по бърза.

Разбира се ако трябва да се извади за всички IP-та, ще трябва да се мине през GROUP BY, макар че за по голяма таблица с 10-100 милиона записа ше е адски бавно и пак бих се замислил дали да не използвам нещо друго.

Отговор
в отговор на ДядoMpaз #7

Re: Е така вече е по-лесно нали?

Защо си мислиш, че има само един запис за това IP?
Защо си мислиш, че двете заявки ще обработят различен брой записи физически, при положение, че имат еднакви FROM и WHERE клаузи?
Защо си мислиш, че ORDER BY няма да ползва временна таблица, а GROUP BY ще ползва за толкова малко записи?
Защо предпочиташ да използваш proprietary MySQL измислица по не set-oriented начин, пред ANSI SQL съвместимия синтаксис?

Разсъжденията ти са bulsh*t отвсякъде, IMNSHO! Въпроса е дали го осъзнаваш?!

cheers,
</wqw>

Отговор
в отговор на til #8

Re: проста работа *DELETED*

Мнението е изтрито от silvig
Отговор
в отговор на til #9

Re: проста работа

A taka ? :
select ... from tbl where ip = '192.168.1.1'
and adate= (select max(adate) from tbl where ip = '192.168.1.1')

Поздрави !!!
Отговор