Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zapytanie z ograniczeniem, BUDUJEMY POCIĄG! :)
pc5
post
Post #1





Grupa: Zarejestrowani
Postów: 61
Pomógł: 0
Dołączył: 10.03.2005

Ostrzeżenie: (0%)
-----


Witam! Mam problem.

Powiedzmy, że buduję pociąg (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) W tabeli przechowuję dane różnych wagoników. Każdy wagonik opisują takie dane jak ciężar, ilość miejsc dla pasażerów. W bazie takich wagoników wpisanych jest już wiele z różnymi wartościami.

Stawiam warunek - wagony w pociągu mogą mieć max ciężar powiedzmy 100t. Jeżeli mam powiedzmy wagoniki po 2t, 10t, 3t, 4t to takich kombinacji może być wiele. Jak stworzyć odpowiednie zapytanie do bazy danych, aby zwrócone wyniki, inaczej mówiąc suma ich ciężarów, nie była wyższa od mojego założenia? Dodatkowo, zwrócone wyniki powinny być zawsze losowe, czyli tworzyć różne dozwolone kombinacje pociągów.

Jak powinno wyglądać takie zapytanie? :/ Proszę o pomoc.

Ten post edytował pc5 15.05.2009, 20:41:18
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
kefirek
post
Post #2





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

Ostrzeżenie: (0%)
-----


GROUP BY, SUM i WHERE

http://dev.mysql.com/doc/refman/5.1/en/gro...-functions.html
Go to the top of the page
+Quote Post
pc5
post
Post #3





Grupa: Zarejestrowani
Postów: 61
Pomógł: 0
Dołączył: 10.03.2005

Ostrzeżenie: (0%)
-----


Znalazłem coś takiego :

  1. SELECT r.id
  2. , r.dlugosc_modulu
  3. , r.dlugosc_modulu + COALESCE((SELECT SUM(dlugosc_modulu)
  4. FROM Wagoniki WHERE (dlugosc_modulu > r.dlugosc_modulu) OR (dlugosc_modulu = r.dlugosc_modulu AND id > r.id)),0) 'Suma'
  5. FROM Wagoniki r
  6.  
  7. ORDER BY r.dlugosc_modulu DESC, r.id DESC


Tabela wygląda mniej więcej tak :
id | nazwa| dlugosc_modulu | waga
0 | Cysterna-A1 | 2 | 23
1 | Cysterna-B341 | 2 | 44
2 | Pasażerski A54 | 3 | 55
3 | Pasażerski A120 | 4 | 68
4 | Węglarka r1910 | 1 | 10
5 | WARS 1 | 5 | 80
6 | WARS 2 | 4 | 50

Zapytanie które wkleiłem zsumuje wszystkie wagoniki. Długość modułu to długość wagonu, w zapytaniu generowana jest suma (długość) pociągu z wagonikiem z wiersza. Czyli :
4
6
8
12
itd

Nie wiem jak zrobić aby z bazy losowane były losowe wagoniki o długości pociągu powiedzmy max 50. Wagoniki mogą się powtarzać. Byle przy każdym selct wychodziły różne kombinacje.

Ktoś może pomóc?

Ten post edytował pc5 15.05.2009, 19:07:24
Go to the top of the page
+Quote Post
maniekl2
post
Post #4





Grupa: Zarejestrowani
Postów: 162
Pomógł: 29
Dołączył: 6.04.2008

Ostrzeżenie: (0%)
-----


Może po prostu pobiesz powiedzmy 20 wagoników.
Dodatkowo:
  1. ORDER BY RAND()

i jak robisz pętle, która wyświetla te wszystkie wagoniki to:
  1. <?php
  2. while($row=mysql_fetch_array($query)){
  3. if($i < 100) {
  4. $i = $i + $row['waga']; // dodaje do $i nową wage
  5. } else {
  6. break; //przerywa
  7. }
  8. }
  9. ?>


PS: Pisane z palca.
Go to the top of the page
+Quote Post
pc5
post
Post #5





Grupa: Zarejestrowani
Postów: 61
Pomógł: 0
Dołączył: 10.03.2005

Ostrzeżenie: (0%)
-----


Cytat(maniekl2 @ 15.05.2009, 18:34:08 ) *
Może po prostu pobiesz powiedzmy 20 wagoników.


Myślałem nad tym. Postanowiłem postawić poprzeczkę wyżej (trzeba się rozwijać (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ) i wykonać to zadanie w zapytaniu do bazy. Można by to jeszcze rozbić na parę zapytań, ale tego chcę uniknąć.

Dla przykładu - chcemy zbudować pociąg o max ciężarze 200t. Jeżeli najmniejsza waga wagonika to 20t - może się okazać, że wyjdzie konfiguracja 10 x 20t. Czyli powinniśmy pobrać teoretycznie minimum 10 wyników z bazy. Jeżeli pobieramy minimym 10, może się okazać, że już 2 pierwsze wiersze będą wyczerpywały limit - powiedzmy 2 wagoniki po 100t? Tworzy się nadmiar. Jeżeli zapytanie będzie wywoływane dziesiątki tysięcy razy - problem.
Go to the top of the page
+Quote Post
magnus
post
Post #6





Grupa: Zarejestrowani
Postów: 99
Pomógł: 15
Dołączył: 15.11.2007
Skąd: Nowogród Bobrz.

Ostrzeżenie: (0%)
-----


Nie uda Ci się tego zrobić zapytaniem do bazy. Ewentualnie w bazie, ale funkcją/procedurą składowaną (czyli de facto programem, tyle że napisanym jakąś odmianą SQL-a).
Najprościej to tak jak kolega wyżej napisał: ORDER BY RAND() i sumowanie. Jedynie, żeby nie pobierać całej tabeli możesz sobie wyliczyć ile max. rekordów będzie potrzebne pobierając minimalną wagę wagonika z tabeli.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.09.2025 - 08:57