![]() |
![]() |
![]()
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%) ![]() ![]() |
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 15.10.2025 - 21:33 |