Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pętla dwa zapytania
Forum PHP.pl > Forum > Przedszkole
nikestylex7
Witam dotychczasowo pobieram dane oddzielnie tzn pojazdy oddzielnie są wyświetlane oraz ładunki oddzielnie. Chciałbym to zmienić i jakoś urozmaicić robiąc przeróbkę aby na jednej stronie pokazywało mi i ładunki i pojazdy czasem do końca w dół.

chodzi mi o taki efekt


Myślę że wystarczy przerobić zapytania mysql lub użyć jakoś pętli.
Moje oddzielne zapytania

Pojazdy:
  1. $sql = "select * from vehicleAdd join user on user.id_log=vehicleAdd.userID join vehicleAddInfo on vehicleAddInfo.uniqID=vehicleAdd.id join payment on payment.userID=user.id_log where vehicleActive = 1 AND vehicleDatetime >= NOW() AND leftTime >= NOW() AND ".$where.$whereSecond.$whereThird." ORDER by vehicleDatetime ASC LIMIT 0,50";


Ładunki:
  1. $sql = "select * from cargoAdd join user on user.id_log=cargoAdd.userID join cargoAddInfo on cargoAddInfo.uniqID=cargoAdd.id join payment on payment.userID=user.id_log where cargoActive = 1 AND cargoDatetime >= NOW() AND leftTime >= NOW() AND ".$where.$whereSecond.$whereThird." ORDER by cargoDatetime ASC LIMIT 0,50";


Gdzie jest ten haczyk?
Turson
GROUP BY
nikestylex7
hmm no tak ale mówisz o grupowaniu a ja bym chciał wyniki z jednego zapytania połączyć z drugim i dać na jedną stronę tylko nie wiem jak połączyć oba zapytania. Na razie wywołując zapytania mam tak

-pojazdy
-pojazdy
-pojazdy
-pojazdy
-pojazdy

potem drugie zapytanie

-ładunki
-ładunki
-ładunki
-ładunki
-ładunki

co na stronie widać tak

-pojazdy
-pojazdy
-pojazdy
-pojazdy
-pojazdy
-ładunki
-ładunki
-ładunki
-ładunki

widoczna jest ta różnica w tym że nie są to wyniki z jednego zapytania tylko z dwóch
nospor
UNION
nikestylex7
Czyli co :

  1. $sql = "
  2.  
  3. select * from vehicleAdd join user on user.id_log=vehicleAdd.userID join vehicleAddInfo on vehicleAddInfo.uniqID=vehicleAdd.id join payment on payment.userID=user.id_log where vehicleActive = 1 AND vehicleDatetime >= NOW() AND leftTime >= NOW() AND ".$where.$whereSecond.$whereThird." ORDER by vehicleDatetime ASC LIMIT 0,50
  4.  
  5. UNION
  6.  
  7. select * from cargoAdd join user on user.id_log=cargoAdd.userID join cargoAddInfo on cargoAddInfo.uniqID=cargoAdd.id join payment on payment.userID=user.id_log where cargoActive = 1 AND cargoDatetime >= NOW() AND leftTime >= NOW() AND ".$where.$whereSecond.$whereThird." ORDER by cargoDatetime ASC LIMIT 0,50
  8.  
  9. ";

a jak w php potem się do tego odwoływać np w pętli for albo while?

  1. //cos
  2. }

nospor
Normalnie, jak w przypadku zwyklego zapytania.
nikestylex7
przyznam że jeszcze tak z bazą nie kombinowałem.

hmm normalnie tylko jak potem to rozdzielić z tego zapytania żeby wypełnić jeden ładunek i jeden pojazd tzn jak miałem dwa zapytania to dawałem dwa zapętlenia a teraz muszę jedno zapętlenie lecz pobierane dane się różnią tzn

przykład ładunek:
  1. <div id='cargoSearchInfo'>".$row['cargoCountry']."<br />".$row['cargoPlace']."<br />".$row['cargoCode']."<br /></div>


przykład pojazd:
  1. <div id='vehicleSearchInfo'>".$row['vehicleCountry']."<br />".$row['vehiclePlace']."<br />".$row['vehicleCode']."<br /></div>
nospor
No i co z tego ze sie roznią? Od tego wymyslono takie konstrukcje jak IF by w zaleznosci od warunkow robic odpowiednie rzeczy.
Robisz IF i dla ladunku generujesz taki DIV, a dla samochodu inny DIV
nikestylex7
Rozumiem że if ale co w tym ifie dać
Sprawdzać pierwsze zapytanie czy jest cargo czy vehicle?

Pojawił się błąd The used SELECT statements have a different number of columns

kod wygląda ok tylko martwi mnie to że chce liczbe kolumn jak pobieram wszystko * ale tez może mieć racje ponieważ vehicle zawiera 21 a cargo 24 kolumny. Jak to rozwiązać?

  1. $sql = "
  2. (select * from vehicleAdd join user on user.id_log=vehicleAdd.userID join vehicleAddInfo on vehicleAddInfo.uniqID=vehicleAdd.id join payment on payment.userID=user.id_log where vehicleActive = 1 AND vehicleDatetime >= NOW() AND leftTime >= NOW() ORDER by vehicleDatetime ASC LIMIT 0,50)
  3. UNION
  4. (select * from cargoAdd join user on user.id_log=cargoAdd.userID join cargoAddInfo on cargoAddInfo.uniqID=cargoAdd.id join payment on payment.userID=user.id_log where cargoActive = 1 AND cargoDatetime >= NOW() AND leftTime >= NOW() ORDER by cargoDatetime ASC LIMIT 0,50)";
nospor
Poprostu zamiast * wyszczegolnij konkretne kolumny ktore cie interesuja. I w obu zapytaniach okresl te samą liczbe kolumn
nikestylex7
kurde a jak mam o 3 kolumny więcej w vehicle i są to dane potrzebne dlatego można jakoś je ściągnąć dodatkowo?

?

a jak bym chciał zliczyć wszystko to musiałbym wypisać kolumny w

  1. COUNT(tutaj)


ponieważ myślę że z pobraniem wszystkiego znowu będzie błąd ilości kolumn
nospor
Cytat
kurde a jak mam o 3 kolumny więcej w vehicle i są to dane potrzebne dlatego można jakoś je ściągnąć dodatkowo?
No to dotworz tam gdzie brakuje
select 0 kolumnaktorejniema, 0 kolumnaktorejniema2, 0 kolumnaktorejniema3, normalnekolumnyktore sa
nikestylex7
kolejne dwa problemy pierwszy to taki że nawet jeśli w pętli mam if to i tak wszystko wyrzuca w divach kolorowanych pod ładunki , pojazdy powinny być w zielonych a są takie same jak ładunki.

zapytanie

  1. $sql = "(select cargoActive,cargoAddingTime,cargoCountry,cargoCode,cargoPlace,cargoDatetime,carg
    oCountrySecond,cargoCodeSecond,cargoPlaceSecond,cargoDatetimeSecond,
  2.  
  3. id_log,uniqID,cname,cowner,cstreet,cplace,name,surname,direct,phone,direct2,fax,
    email,
  4.  
  5. cargoTypeBuild,cargoCargo,cargoLoadCargo,cargoPalette,cargoBid,cargoCurrency,car
    goCheckCargo,cargoWidth,cargoHeight,cargoLenght,cargoVolume,cargoLoadType,cargoCa
    rgoType,cargoWhat1,cargoWhat2,cargoWhat3,cargoWhat4,cargoWhat5,cargoWhat6,cargoWh
    at7,cargoWhat8,cargoText
  6.  
  7. from cargoAdd join user on user.id_log=cargoAdd.userID join cargoAddInfo on cargoAddInfo.uniqID=cargoAdd.id join payment on payment.userID=user.id_log where cargoActive = 1 AND cargoDatetime >= NOW() AND leftTime >= NOW() LIMIT 0,50)
  8. UNION
  9. (select vehicleActive,vehicleAddingTime,vehicleCountry,vehicleCode,vehiclePlace,vehicleD
    atetime,vehicleCountrySecond,vehicleCodeSecond,vehiclePlaceSecond,vehicleDatetime
    Second,
  10.  
  11. id_log,uniqID,cname,cowner,cstreet,cplace,name,surname,direct,phone,direct2,fax,
    email,
  12.  
  13. vehicleTypeBuild,vehicleCargo,vehicleLoadCargo,0,vehicleBid,vehicleCurrency,0,ve
    hicleWidth,vehicleHeight,vehicleLenght,vehicleVolume,vehicleLoadType,0,vehicleWha
    t1,vehicleWhat2,vehicleWhat3,vehicleWhat4,vehicleWhat5,vehicleWhat6,vehicleWhat7,
    vehicleWhat8,vehicleText
  14.  
  15. from vehicleAdd join user on user.id_log=vehicleAdd.userID join vehicleAddInfo on vehicleAddInfo.uniqID=vehicleAdd.id join payment on payment.userID=user.id_log where vehicleActive = 1 AND vehicleDatetime >= NOW() AND leftTime >= NOW() ORDER by cargoDatetime, vehicleDatetime ASC)
  16. ";
  17. //potem robie //
  18. $result=mysql_query($sql)or die (mysql_error());
  19. while($row=mysql_fetch_assoc($result))
  20. {
  21. if (isset($row['cargoActive'])) {
  22. //jeśli są ładunki//
  23. }else{
  24. //jeśli pojazdy//
  25. }


Drugi błąd to zliczanie danych w bazie bląd Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /newsearch.php on line 1181

  1. $sql = "(select COUNT(*) from cargoAdd join user on user.id_log=cargoAdd.userID join cargoAddInfo on cargoAddInfo.uniqID=cargoAdd.id join payment on payment.userID=user.id_log where cargoActive = 1 AND cargoDatetime >= NOW() AND leftTime >= NOW())
  2. UNION
  3. (select COUNT(*) from vehicleAdd join user on user.id_log=vehicleAdd.userID join vehicleAddInfo on vehicleAddInfo.uniqID=vehicleAdd.id join payment on payment.userID=user.id_log where vehicleActive = 1 AND vehicleDatetime >= NOW() AND leftTime >= NOW())
  4. ";


?
nospor
Manual naprawde nie gryzie:
http://dev.mysql.com/doc/refman/5.0/en/union.html
Cytat
The column names from the first SELECT statement are used as the column names for the results returned.


Jesli chcesz wiedziec ktore jest ktore, to robisz tak:
select 1 as typ,.....
union
select 2 as typ

A potem w petli:
if ($row['typ']==1) //to pochodzi z pierwszego select
else //to pochodzi z drugiego select

zas co do drugiego bledu, to naucz sie pisac w jednej linii mysql_query a w drugiej mysql_fetch_array. W programowaniu naprawde im mniej nie znaczy lepiej
com
Jak już to tak:
  1. $count = mysql_fetch_row(mysql_query($sql)) or die (mysql_error());


Ale tak jak napisał nospor tak się tego nie powinno robić tu masz pokazane jak to ma wyglądać http://pl1.php.net/mysql_fetch_row
nikestylex7
hmm dzięki za słuszne rady zapamiętam na przyszłość co do ifa to działa lecz problem istnieje teraz w tym że jak w
  1. while($row=mysql_fetch_assoc($result))

pobiorę wartości z mojego zapytanie które podałem wyżej to wszystkie dane $row['wszystkie z cargo'] działają poprawnie lecz gdy przyjdzie pobrać wszystko z $row['wszystko z vehicle'] to nic nie zostaje wyświetlone tak jakby te dane w ogóle w bazie nie istniały. Być może problem istnieje w zapytaniu z UNION lecz żadnego błędu nie pokazuje.
nospor
Przeciez ci napisalem, ze nazwy kolumn beda takie jak w pierwszym zapytaniu...
Ciezko zrobic
print_r($row);
i samemu na wlasne oczy zobaczyc jak wyglada rekord na ktorym aktualnie pracujesz?
nikestylex7
hmm no już rozumiem śmiga.

Następny problem to sortowanie chciałbym żeby posortowało wyniki od najniższego czyli dopisuje ORDER BY cargoDatetime,vehicleDatetime DESC lecz bez rezultatu.

Kolejny to gdzie umieścić limit 0,50 tak aby działał w 1 selekcie czy 2
nospor
wszystko to masz opisane w linku, ktory ci podalem. Zacznijk w koncu do niego zagladac. Masz tam ladnie opisane na czym polega rola nawiasow by uzyskac rozne efekty
nikestylex7
Dzięki nospor za wszystko
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.