Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie z ograniczeniem
Forum PHP.pl > Forum > Bazy danych > MySQL
pc5
Witam! Mam problem.

Powiedzmy, że buduję pociąg 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.
kefirek
GROUP BY, SUM i WHERE

http://dev.mysql.com/doc/refman/5.1/en/gro...-functions.html
pc5
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?
maniekl2
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.
pc5
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ć 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.
magnus
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.
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.