|
Тема
|
въпрос за select
|
|
Автор | til (Нерегистриран) |
Публикувано | 07.06.06 23:57 |
|
имам следният въпрос
значи за дандено ip във една таблица има да речем 22 записа как мога да селектна последният запис за това ип
| |
Тема
|
Re: проста работа
[re: til]
|
|
Автор |
salle (един такъв) |
Публикувано | 08.06.06 00:15 |
|
Само дефинирай какво имаш предвид "последния запис"
| |
Тема
|
Re: проста работа
[re: salle]
|
|
Автор | til (Нерегистриран) |
Публикувано | 08.06.06 00:42 |
|
Еми случаят е следният имам една таблица с две полета:
в едното се записва дата и време под формата на unix timestamp а във другото ip номера и да речем че за период от два часа да речем от 00:00:00 до 02:00:00
дадено ип се среща няколко пъти да речем 6 пъти аз искам да изкарам последният шести път и да взема времето
| |
Тема
|
Re: Е така вече е по-лесно нали?
[re: til]
|
|
Автор |
salle (един такъв) |
Публикувано | 08.06.06 01:43 |
|
"в едното се записва дата и време под формата на 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;
| |
Тема
|
Re: Е така вече е по-лесно нали?
[re: salle]
|
|
Автор |
mr.vain (пътник 57) |
Публикувано | 10.06.06 23:34 |
|
А защо не с агрегат?
SELECT ... MAX(ts) AS maxTS ... WHERE ... GROUP BY ip;
Само питам.
Има три вида хора. Част от проблема, част от решението и част от пейзажа.
| |
Тема
|
Re: Е така вече е по-лесно нали?
[re: mr.vain]
|
|
Автор | ДядoMpaз (Нерегистриран) |
Публикувано | 15.06.06 09:18 |
|
За такава заявка няма смисъл от агрегат. GROUP BY най вероятно ще направи темп таблица в паметта, което за един ред е излишно. Освен това limit е оптимизиран доста добре пък ако има и индекс на датата и IP-то MySQL ще прочете от диска само реда който му трябва, останалото ще го вземе от индекса който при нормални настройки е вече зареден в паметта. Скороста на изпълнение ще е с пъти по бърза.
Разбира се ако трябва да се извади за всички IP-та, ще трябва да се мине през GROUP BY, макар че за по голяма таблица с 10-100 милиона записа ше е адски бавно и пак бих се замислил дали да не използвам нещо друго.
| |
Тема
|
Re: Е така вече е по-лесно нали?
[re: ДядoMpaз]
|
|
Автор |
wqw (АзСъмЖив) |
Публикувано | 15.06.06 17:20 |
|
Защо си мислиш, че има само един запис за това IP?
Защо си мислиш, че двете заявки ще обработят различен брой записи физически, при положение, че имат еднакви FROM и WHERE клаузи?
Защо си мислиш, че ORDER BY няма да ползва временна таблица, а GROUP BY ще ползва за толкова малко записи?
Защо предпочиташ да използваш proprietary MySQL измислица по не set-oriented начин, пред ANSI SQL съвместимия синтаксис?
Разсъжденията ти са bulsh*t отвсякъде, IMNSHO! Въпроса е дали го осъзнаваш?!
cheers,
</wqw>
| |
Тема
|
Re: проста работа *DELETED*
[re: til]
|
|
Автор |
silvig (fine) |
Публикувано | 03.07.06 22:05 |
|
Мнението е изтрито от silvig
| |
Тема
|
Re: проста работа
[re: til]
|
|
Автор |
silvig (fine) |
Публикувано | 03.07.06 22:12 |
|
A taka ? :
select ... from tbl where ip = '192.168.1.1'
and adate= (select max(adate) from tbl where ip = '192.168.1.1')
Поздрави !!!
| |
|
|
|
|