Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: przypisanie odpowiednich wartości
Forum PHP.pl > Forum > Bazy danych > MySQL
mihmih
Witam,

mam pewien problem i nie mogę sobie poradzić... Mam pewną grupę operacji, kolumny to nazwa operacji, kolejność, długość operacji, id konstrukcji

op1, 3, 4, 1
op2, 2, 2, 2
op3, 7, 1, 1
op4, 5, 8, 1
op5, 8, 4, 2

Chodzi o to, że te operacje należy wykonać wg kolejności od najmniejszej wartości do największej i potrzebuje ile jednostek czasowych przed jakimś tam terminem trzeba zakończyć każdą operacje, żeby, utrzymując poprawną kolejność, zmieścić się w czasie. Wszystko musi odbywać się z ramach jednej konstrukcji. Czyli chcę otrzymać:

13
6
1
9
4

Ktoś ma może jakiś pomysł?
trueblue
Mógłbyś wyjaśnić skąd się wziął wynik?

Ja kiedy je posortowałem według kolejności, otrzymałem czasy: 2, 4, 8, 1, 4, czyli całość operacji to 19 jednostek. Operacje więc musiałaby się kończyć przed: (19-2)=17, (19-2-4)=13, (19-2-4-8)=5, (19-2-4-8-1)=4, (19-2-4-8-1-4)=0.
mihmih
Wszystko ładnie, tylko chodzi o to że to są dwie różne konstrukcje, dla których odejmujemy wartości osobno. Ostatnia kolumna to id konstrukcji. Operacja wykonywana w celu zbudowania jednej konstrukcji nie wpływa na inne konstrukcje.
trueblue
Nie określiłeś, że obliczanie czasu ma być również odrębne dla konstrukcji, lecz "operacje należy wykonać wg kolejności od najmniejszej wartości do największej".

To nie jest rozwiązanie, bo prosiłem, abyś wyjaśnił skąd się wzięły liczby. Tak chyba będzie łatwiej znaleźć rozwiązanie, którego szukasz.

P.S. Dla odrębnych konstrukcji mamy czasy całkowite 13 oraz 6. Choć nadal nie wiem czy ma to w ogóle sens, bo nie wiem jaki tok postępowania przyjąć.
mihmih
Napisałem w pierwszym poście, że: "Wszystko musi odbywać się z ramach jednej konstrukcji"... ale masz racje, niepotrzebnie dodawałem czas tej konkretnej operacji w każdym przypadku. A więc wynikiem powinno być:

9
4
0
1
0

i tak np. 9 ponieważ konstrukcja nr 1 potrzebuje 3 operacji, a op1 w tej konstrukcji ma za sobą dwie operacje, które po wykonaniu op1 potrzebują 9 jednostek czasu.
trueblue
Nadal nie rozumiem.
Skąd 4 i 0?
Jeśli op1 potrzebuje 9 jednostek (za nią są 8+1), to op2 1 jednostkę (za nią 1), a op3 0 jednostek (za nią nic).
mihmih
4 dlatego że:

op2 wchodzi wskład konstrukcji nr 2
ta konstrukcja składa się z dwóch operacji: op2 i op5
najpierw należy wykonać op2, potem op5 (2<8)
op2 zatem musi być zakończona 4 dni przed terminem 0, ponieważ po wykonaniu op2 potrzeba jeszcze 4 jednostek czasu na wykonanie op5
trueblue
Jeszcze bardziej stało się to dla mnie zagmatwane.
Najpierw była wartość 9 wynikająca z 3 operacji dla konstrukcji 1, a teraz jako druga pojawia się wartość wynikająca z konstrukcji 2, choć pisałeś, że wszystko ma się odbywać w ramach jednej konstrukcji (a z tego wyjaśnienia wynika, że jednak operacje są przemieszane).

Jeśli kluczem sortowania będzie kolejność, to:
oper: 2 1 4 3 5
czas: 2 4 8 1 4
kons: 2 1 1 1 2
czyli operacje będę przemieszane względem konstrukcji.

Możesz pokazać w jakiej kolejności należy posortować przykładowe rekordy (na razie abstrahując od liczenia czasu)?
mihmih
1. Mam listę wszystkich operacji, ale operacje mogą być wykorzystywane do różnych konstrukcji.
2. Przy każdej operacji chce uzyskać kolumnę, z wartością ile jednostek czasowych przed terminem 0 musi być zakończona dana operacja, żeby przypisana do niej konstrukcja była zakończona w terminie
3. Np. w przypadku op1... wchodzi ona wskład wykonania konstrukcji nr 1 wraz z dwoma innymi operacjami: op3 i op4. Jest to pierwsza operacja potrzebna do wykonania tej konstrukcji (3<5, 3<7), a więc musi być ona wykonana na 9 dni przed terminem. 9 dni ponieważ op3 zajmuje 1 dzień, a op4 8 dni.

Konstrukcje należy rozpatrywać osobno, ale lista operacji jest jedna, z różnymi konstrukcjami do nich przypisanymi. Czy teraz jest to trochę bardziej jasne?

trueblue
  1. CREATE TABLE `operacja` (
  2. `id_operacja` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `operacja` CHAR(3) NULL DEFAULT NULL,
  4. `sort_key` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  5. `czas` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  6. `id_konstrukcja` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  7. PRIMARY KEY (`id_operacja`)
  8. )
  9. COLLATE='utf8_general_ci'
  10. ENGINE=MyISAM
  11. ;


  1. SELECT o1.operacja, COALESCE(SUM(o2.czas),0)
  2. FROM operacja AS o1
  3. LEFT JOIN operacja AS o2 ON o1.sort_key<o2.sort_key AND o1.id_konstrukcja=o2.id_konstrukcja
  4. GROUP BY o1.id_operacja



mihmih
dzięki za pomoc. Dopiero w weekend będę miał okazję sprawdzić to na prawdziwej bazie, ale w teorii wygląda na to o co mi chodziło. Dziękuję.

Jeszcze się zastanawiam nad jedna rzeczą...jeśli w jakiejś konstrukcji będzie 7 operacji poprzedzających konkretna operacje i w sumie będzie należało odjąć 30 dni. To pojawia się tutaj problem weekendów i świąt. Bo oczywiście pracujemy jedynie w dni robocze.

- jak do wartości 30 dodać określoną wartość wynikająca z weekendów pomiędzy tymi dwoma datami
- jak do tej wartości dodać kolejne wartości, jeśli wynik powyżej wyjdzie w sobotę lub niedzielę
- jak w tym wszystkim uwzględnić święta, których daty są przechowywane w dodatkowej tabeli
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.