![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 10.09.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Mam pewien problem. Otóż chciałbym zrobić niestandardowe wyciąganie rekordów z bazy danych. Przykadowa baza danych:
System pobiera pojedynczo rekordy(ASC id) a następnie je wykonuje zmieniając status na 1. Cały problem polega na tym że wykonanie jednego procesu trwa około minuty i gdy jeden user doda trochę więcej rekordów to reszta (która doda trochę później) czeka kilkanaście minut na rozpoczęcie wykonywania co ich trochę irytuje. Chciałbym przerobić zapytanie aby rekordy były wybierane w inny spsób, a mianowicie po jednym rekordzie od każdego usera. Czyli w kolejności następującej(id): 1,4,6,2,5,3 Czy ktoś wie jak takie coś zrobić? Oczywiście w międzyczasie inny user może dodać kolejny proces i wtedy jego pierwszy wpis musi zostać wybrany w ciągu trwającego przejścia po wszystkich userach. Z góry dzięki, pozdrzwiam Żaden "specjalista" nie umie pomóc? W innych postach jakoś "specjaliści" się wypowiadają. Ktoś posiada wiedzę wykraczającą ponad podstawowe zapytania? Ten post edytował robson_admin 17.12.2009, 23:11:44 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Może zamiast prowkować 'specjalistów' zastanów się czy wystarczająco dobrze opisałeś problem.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 10.09.2005 Ostrzeżenie: (0%) ![]() ![]() |
Podałem kod bazy i co chce mieć na wyjściu + opis. Wg mnie jest to wystarczające....
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Tak na początek, nie masz w ogóle czasu dodania procesu do kolejki, więc nie sposób stwierdzić, który proces pojawił się wcześniej. Sortowanie po kolumnie auto_increment nie jest tutaj pewnym rozwiązaniem.
Dalej: Kod SELECT user, MIN(id) AS id FROM proces WHERE status = 0 GROUP BY user da ci najmniejsze id procesów niewykonanych dla każdego użytkownika (normalnie powinieneś to zrobić po kolumnie z czasem dodania procesu do kolejki) dalej Kod SELECT p.id, p.user, p.status, p.proc FROM proces AS p CROSS JOIN (SELECT user, MIN(id) AS id FROM proces WHERE status = 0 GROUP BY user) AS sq USING (user,id) i masz już listę procesów do wykonania w danym cyklu. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 10.09.2005 Ostrzeżenie: (0%) ![]() ![]() |
Hmm no nie do końca to działa tak jak chciałem...
"System pobiera pojedynczo rekordy(ASC id) a następnie je wykonuje zmieniając status na 1" i wtedy to zapytanie się gubi. Bo myśli że dany user nie wykonuje żadnego procesu... Co do daty dodania to mogę zrobić dodatkową tabele o formacie DateTime i nazwie data. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Wiesz, trudno coś więcej wymyśleć nie znając szczegółów tego jak dział ten system.
Ja bym podszedł do tego tak: Zrobiłbym dodatkową tabelę, do której przy pomocy zapytania powyżej przerzucałbym procesy do wykonania (wystarczy same id). Jak długo w tej tabeli są niewykonane procesy, tak długo system zajmuje się ich wykonywaniem. Gdy wszystkie wykona, sięga do tabeli proces po nową porcję. Podobną metodę można zastosować dodając do tabeli proces nową kolumnę, w której zapisywałbyś na przykład czas rozpoczęcia wykonywania danej porcji procesów. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 23:23 |