Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 23.10.2007 Ostrzeżenie: (0%)
|
Z góry przepraszam za mało znaczący tytuł tematu.
Posiadam tabelę w bazie danych w mysql o strukturze: `id` - int, autoincremental `name` - varchar `status` - varchar `start` - datetime `stop` - datetime `opis` - longtext Przechowywane i dopisywane są w niej nazwy wykonanych zadań wraz z datą startu, stopu, oraz statusie zakończenia + w opisie log. Wartości dla `name` są powtarzalne, jest to ok 150 różnych wpisów (chociaż zawsze mogą dojść nowe). `status` możne przyjmować tylko 3 wartości- 'O' (o.k) , 'B' (bad), 'U' (unknown). Problemik polega na wyszukaniu wszystkich zadań, które ostatnio zakończyły się (`stop`) co najmniej 3-krotnym niepowodzeniem (`status` = 'B'), przy czym status 'U' zadania nie jest brany w ogóle pod uwagę. Raport musi zawierać: nazwę zadania ( `name`), ile razy się nie udał , ostatni udany (`id`), ostatni nieudany(`id`) Proste wyszukiwanie poprzez wyciągnięcie wszystkich możliwych nazw i późniejszą iterację (w PHP ) po wszystkich rekordach o danym `name` jest lekko nieefektywne ze względu na ok 1 mln rekordów w tabeli - codziennie pojawia się ok 5000 nowych. Typ silnika i indexy mogę dowolnie zmieniać. |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 23.10.2007 Ostrzeżenie: (0%)
|
Sprawdzę jutro na tabeli i zapodam wynik.
Obecnie algorytm wyszukuje wszystkie unikalne nazwy: SELCET DISTINCT name FROM tabela ORDER BY name; a z uzyskanej listy wybierane są rekordy dla konkretnego zadania SELECT id, status FROM tabela WHERE name='zadanieX' ORDER BY id DESC; w PHP następuje zliczanie rekordów ze `status`=' B' od najnowszego( największe `id`) aż do tego, który ma `status`= 'O' Napiszę szczerze, że nie wiem, w jaki sposób wyciągnąć jednym zapytaniem listę zadań, których ostatni `status`='B'. (nadal muszę uwzględnić to, że `status`='U' w ogóle nie jest brany pod uwagę!!!) Wtedy byłoby znacznie mniej do przeglądania. |
|
|
|
leon1313 optymalny algorytm wyszukiwania 25.05.2009, 21:26:34
erix A nie prościej przez group by...? Trochę zagmatwał... 26.05.2009, 17:18:54
heaven Tu masz rozwiązanie
[SQL] pobierz, plaintext SELE... 27.05.2009, 10:45:07 ![]() ![]() |
|
Aktualny czas: 30.12.2025 - 18:24 |