Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL]Łączenie zapytań
Forum PHP.pl > Forum > Przedszkole
sledzik
Czy da się połączyć takie dwa zapytania w jedno?
Wszystko się opiera o tabele news ale nie wychodzi mi to.. ;/

  1. $query1 ="
  2. SELECT sos_categories.*
  3. FROM sos_news
  4. JOIN sos_categories
  5. ON sos_categories.categories_id = sos_categories.categories_id
  6. ORDER BY news_date_add DESC LIMIT 0, 5
  7. ";



  1. $query2 ="
  2. SELECT ".$prefix."news.*,".$prefix."users.*,".$prefix."news_categories.*
  3. FROM ".$prefix."news
  4. JOIN ".$prefix."users
  5. ON ".$prefix."news.users_id = ".$prefix."users.users_id
  6. JOIN ".$prefix."news_categories
  7. ON ".$prefix."news.news_id = ".$prefix."news_categories.news_id
  8. ORDER BY news_date_add
  9. DESC LIMIT $limit, $onpage
  10. ";


Prubuje tak ale to nie dziala:
  1. $query3 ="
  2. SELECT ".$prefix."news.*,".$prefix."users.*,".$prefix."news_categories.*,".$prefix."categories.*
  3. FROM ".$prefix."news
  4. JOIN ".$prefix."users
  5. ON ".$prefix."news.users_id = ".$prefix."users.users_id
  6. JOIN ".$prefix."news_categories
  7. ON ".$prefix."news.news_id = ".$prefix."news_categories.news_id
  8. JOIN ".$prefix."sos_categories
  9. ON ".$prefix."sos_categories.categories_id = ".$prefix."sos_categories.categories_id
  10. ORDER BY news_date_add
  11. DESC LIMIT $limit, $onpage
  12. ";
trueblue
  1. ON sos_categories.categories_id = sos_categories.categories_id


Czym się różnią tabele categories oraz news_categories?
sledzik
categories czyli(np)
spozywcze
cukiernicze
ala ma kota...
itp

news
id
content
itd newsa..

categories news(laczy te dwie)
news_id categories_id

//wroc moj pomysl to..
  1. ON ".$prefix."sos_categories.categories_id = ".$prefix."sos_news_categories.categories_id

lecz to bledne myslenie
trueblue
Wskazałem Ci błąd.
sledzik
no ok ale szkopul w tym ze w tabeli news nie ma zadnego nawiazania do categories wiec nie moge chyba jako tak uzyc JOIN?
trueblue
No, więc łączysz je przez news_categories.
sledzik
kurde nie rozumiem , dalbys mi strone gdzie sa jakies przyklady lub napisal jakies przykladowe zapytanie jesli nie to
com
no żeby coś załączyć musisz mieć element wspólny(klucz), na tym polegają relacyjne bazy danych smile.gif
sledzik
no tak ..

dlatego tabela news_categories laczy -> news i categories poprzez news_id oraz categories_id
tylko ze w zapytaniu chce jeszcze pobrac users_id z tabeeli users (czyli jakis id) uzytkownika ktory pisze news...

czy robiac JOIN pomiedzy dwoma pierwszymi tabelami nie musze juz brac pod uwage tabeli uzytkownikow bo w news jest pole users_id i tam jest deklarowane kto pisze posta i bede mogl to wywolac laczac te dwie pierwsze tylko tabele?
trueblue
Łączysz (i wybierasz we FROM) tylko te tabele, z których chcesz pobrać dane.

Oczywiście jeśli tabela przejściowa łączy jakieś tabele, z której to najczęściej nie wybierasz danych, to też ją umieszczasz w klauzuli FROM.
sledzik
Teoretycznie chyba mi sie udalo, blad byl gupi,a raczej polegal na slepocie jak zazywczaj.

  1. $query1 ="
  2. SELECT ".$prefix."news.*,".$prefix."users.*,".$prefix."news_categories.*,".$prefix."categories.*
  3. FROM ".$prefix."news
  4. JOIN ".$prefix."users
  5. ON ".$prefix."news.users_id = ".$prefix."users.users_id
  6. JOIN ".$prefix."news_categories
  7. ON ".$prefix."news.news_id = ".$prefix."news_categories.news_id
  8. JOIN ".$prefix."categories
  9. ON ".$prefix."categories.categories_id = ".$prefix."news_categories.categories_id
  10. ORDER BY news_date_add
  11. DESC LIMIT $limit, $onpage
  12. ";


Mam jeszce jeden problem.
Posiadam taki kod wyswietlajacy:
I teraz jak jakis news ma wiecej niz 2 kategorie to pokazywany jest w nowym wierszu jako odrebny z nowa kategoria.
Jak to poprawic?
  1. if(mysqli_num_rows($result) > 0) {
  2.  
  3. echo '<div class="table-responsive"><table class="table table-hover">';
  4. echo"<tr><thead>";
  5.  
  6. echo'<th>KATEGORIA <a href="m.php?s=news&a=v&c=s';
  7. if(isset($_GET['page'])) echo '&page='.$_GET['page'];
  8. echo'" ><img src="images/s.png" alt="sort" /></th>';
  9. echo"</thead></tr>";
  10.  
  11. while($r = mysqli_fetch_assoc($result)) {
  12. echo"<td><span class='rama label' style='color:#".$r['categories_color_text']."; background-color:".$r['categories_color_bg'].";'>".$r['categories_name']."</span></td>";
  13. echo "</tr>";
  14. }
  15. echo "</table></div>";
  16. }
nospor
Musis wpierw pogrupowac dane a potem wyswietlac jak ci pasuje
http://nospor.pl/grupowanie-wynikow.html
sledzik
mógłby mi ktoś pomoc z tym grupowaniem? bo pomimo przykladow nie umiem tego zrobic;/
wydawało mi się, że na podstawie przykładów coś wymyśle , ale siedzę już tyle czasu i nie bardzo
ew moge zaloczyc swoje smieciowe kody

nospor
if (!isset($categories[$nid]))
$kat[$nid] = array('name' => $r['news_title'],'categories' => array());
Sprawdzasz $categories, wpisujesz do $kat....

Tak da sie to zrobic, tylko trzeba pisac uwaznie.
sledzik
No ok, literowka po ciaglych modyfikacjach.. lecz to nie to
Jest tak:
tytul newsta (liczba kategori: 1)
Kategoria o naz Ważne i id 1

tytul newsta (liczba kategori: 2)
Kategoria o naz Ważne i id 1
Kategoria o naz Ciacho i id 2

tytul newsta (liczba kategori: 3)
Kategoria o naz Ważne i id 1
Kategoria o naz Ciacho i id 2
Kategoria o naz Grzybki i id 3

a powinno byc tak:
tytul newsta (liczba kategori: 3)
Kategoria o naz Ważne i id 1
Kategoria o naz Ciacho i id 2
Kategoria o naz Grzybki i id 3

jesli to dobrze rozumiem

i teraz tak?
wedlug mnie jest tak gdyz

ta linai wykonuje skrypt x razy(tyle ile jest kategorii)

  1. foreach ($kat as $idCat => $category){


ale z tej petli nie moge wyjsc bo ta bardziej wenetrzna przestanie dzialac
nospor
skoro chcesz grupowac po newsach to masz odwrocic sytuacje niz ja podalem w arcie. Ja ta grupowalem po kategoriach.
sledzik
przeciez juz newsy sa nadrzedne to nie w tym rzecz? u ciebie jest tak jakby produkt podrzebny czyli moj news, czyli syturacja tak jakby juz jest odwrocona..?
nospor
W kodzie co podales grupujesz po category a nie po newsach. RObisz dokladnie tak jak mam w arcie. A ja ci mowie ze masz zrobic na odwrot. masz grupowac po newsach i do nich dodawac kategorie
sledzik
oO , pominimy tamte kody

Ten kod jest wedlug mnie odwrocony, juz inaczej nie umiem go odwrocic, a zwraca to co w poscie powyzej...?

  1. $newst = array();
  2.  
  3. while($r = mysqli_fetch_assoc($result)) {
  4.  
  5. //najpierw pozyskamy niezbędne dane
  6.  
  7.  
  8. $nid = $r['news_id'];
  9.  
  10. //jeśli nie było jeszcze danego newsa, to ją tworzymy
  11. if (!isset($newst[$nid]))
  12. $newst[$nid] = array('name' => $r['news_title'], 'categories' => array());
  13.  
  14. //dodajemy do newsa kolejne katgorie
  15. if (!empty($r['categories_name'])) //jeśli istnieje news
  16. $newst[$nid]['categories'][] = array('name' => $r['categories_name'], 'id'=>$r['categories_id']);
  17.  
  18.  
  19. //echo'<pre>';
  20. //print_r($newst); //do obejrzenia jak wygląda wygenerowana tablica
  21. //echo'</pre>';
  22.  
  23.  
  24. //a teraz wygenerujemy stronę na podstawie uzyskanych danych
  25. echo '<ul>';
  26. foreach ($newst as $id => $newsy){ //petla, która leci po newsach
  27. echo '<li>'.$newsy['name'].' (liczba kategori: '.count($newsy['categories']).')<ul>';
  28. foreach ($newsy['categories'] as $cat){ //pętla, która leci po kategoriach w newsach
  29. echo '<li>Nazwa <b>'.$cat['name'].'</b> i id <b>'.$cat['id'].'</b></li>';
  30. }
  31. echo '</ul></li>';
  32. }
  33. echo '</ul>';
nospor
Kod wyswietlajacy ma byc poza petla WHILE a nie w petli WHILE
sledzik
No oczywiscie.. jak ja kocham takie bledy, az sie plakac chce.. Dzieki!

ostatnie pytanie
skoro to ma byc za petla:

  1. foreach ($newst as $id => $newsy){ //petla, która leci po newsach
  2. foreach ($newsy['categories'] as $cat){ //pętla, która leci po kategoriach w newsach
  3. echo '<td>Nazwa'.$cat['name'].'</td>';
  4. }


to jak to wcisnac w kod wyswietlajacy podany wczesniej? chodzi o:

  1. if(mysqli_num_rows($result) > 0) {
  2.  
  3. echo '<div class="table-responsive"><table class="table table-hover">';
  4. echo"<tr><thead>";
  5.  
  6. echo'<th>KATEGORIA <a href="m.php?s=news&a=v&c=s';
  7. if(isset($_GET['page'])) echo '&page='.$_GET['page'];
  8. echo'" ><img src="images/s.png" alt="sort" /></th>';
  9. echo"</thead></tr>";
  10.  
  11. while($r = mysqli_fetch_assoc($result)) {
  12. echo"<td><span class='rama label' style='color:#".$r['categories_color_text']."; background-color:".$r['categories_color_bg'].";'>".$r['categories_name']."</span></td>";
  13. echo "</tr>";
  14. }
  15. echo "</table></div>";
  16. }


tak jak powyzej kod jest pod tabela
nospor
Najpierw przygotowujesz dane do wyswietlania, potem dopiero dane wyswietlasz. To sie nazywa oddzielenie logiki od widoku
sledzik
Nie da sie tego jakos prosciej zrobic zapytaniami sql?(dzielac na dwa zapytania)?
Nie wiem jak z wydajnoscia potem tego..
nospor
Czytamy jeszcze raz ze zrozumieniem:
najpierw logika, potem wyswietlanie. Tak sie robi w normalnych aplikacjach. poczytaj o MVC jak mi nie wierzysz.
sledzik
wierze, wierze.. tylko MVC to kod obiektowy , a mi wystarczy napisac to strukturalnie
nospor
ja ci nie karze tego pisac jako obiektowka. Ja ci tylko mowie, bys zaporzyczyl dobre zachowanie, ktore jest:
NAJPIERW LOGIKA, POTEM WYSWIETLANIE
Mam ci to poraz czwarty jeszcze pisac?
sledzik
Nie spokojnie smile.gif
bardzo cenie twoje rady, lecz nie zawsze umiem je zastosowac...

wymoncilem cos takiego(ponizej kod):

Wyswietla sie fajnie, ale problem jest taki, ze gdy np aktywuje lub dezaktywuje newsa
  1. if ($newsy['active']=='0'){
  2. echo'<td>
  3. <a href="admin.php?s=news&a=akt&id='.$nid.'" id="js-news-aktywny" data-original-title="Przyklej" data-toggle="tooltip" type="button" class="btn btn-xs btn-danger js-are-you-sure"><i class="fa fa-fw fa fa-close"></i></a>
  4. </td>';


to zawsze korzysta z tego samego id . Czyli zawsze ten sam news..

  1. if(mysqli_num_rows($result) > 0) {
  2. $newst = array();
  3. while($r = mysqli_fetch_assoc($result)) {
  4.  
  5. $nid = $r['news_id'];
  6.  
  7. //jeśli nie było jeszcze danego newsa, to ją tworzymy
  8. if (!isset($newst[$nid]))
  9. $newst[$nid] = array(
  10. 'users' =>$r['users_login'],
  11. 'name' => $r['news_title'],
  12. 'date_add' =>$r['news_date_add'],
  13. 'date_end' =>$r['news_date_end'],
  14. 'display' =>$r['news_display'],
  15. 'active' =>$r['news_active'],
  16. 'stick' =>$r['news_stick'],
  17. 'categories' => array());
  18.  
  19. //dodajemy do newsa kolejne katgorie
  20. if (!empty($r['categories_name'])) //jeśli istnieje news
  21. $newst[$nid]['categories'][] = array('bg' => $r['categories_color_bg'], 'color' => $r['categories_color_text'], 'name' => $r['categories_name'], 'id'=>$r['categories_id']);
  22.  
  23.  
  24. /* echo'<pre>';
  25.   print_r($newst); //do obejrzenia jak wygląda wygenerowana tablica
  26.   echo'</pre>'; */
  27.  
  28. }
  29.  
  30.  
  31. //a teraz wygenerujemy stronę na podstawie uzyskanych danych
  32. echo '<table class="table">
  33. <thead>
  34. <tr>
  35. <th>LOGIN</th>
  36. <th>TYTUL</th>
  37. <th>KATEGORIA</th>
  38. <th>DATA ADD</th>
  39. <th>DATA END</th>
  40. <th>WYŚ</th>
  41. </tr>
  42. </thead>
  43. <tbody>
  44. ';
  45. foreach ($newst as $id => $newsy){ //petla, która leci po newsach
  46. echo '<tr>
  47. <td>'.$newsy['users'].'</td>
  48. <td>'.$newsy['name'].'</td><td>';
  49. foreach ($newsy['categories'] as $cat){ //pętla, która leci po kategoriach w newsach
  50. echo"<span class='rama label' style='color:#".$cat['color']."; background-color:".$cat['bg'].";'>".$cat['name']."</span>";
  51. }
  52. echo '</td><td>'.$newsy['date_add'].'</td>
  53. </td><td>'.$newsy['date_end'].'</td>
  54. </td><td>'.$newsy['display'].'</td>
  55. ';
  56.  
  57. if ($newsy['active']=='0'){
  58. echo'<td>
  59. <a href="admin.php?s=news&a=akt&id='.$nid.'" id="js-news-aktywny" data-original-title="Przyklej" data-toggle="tooltip" type="button" class="btn btn-xs btn-danger js-are-you-sure"><i class="fa fa-fw fa fa-close"></i></a>
  60. </td>';
  61. }
  62. if ($newsy['active']=='1'){
  63. echo'<td>
  64. <a href="admin.php?s=news&a=dezakt&id='.$nid.'" id="js-news-dezaktywny" data-original-title="Odklej" data-toggle="tooltip" type="button" class="btn btn-xs btn-success js-are-you-sure"><i class="fa fa-fw fa fa-check"></i></a>
  65. </td>';
  66. }
  67.  
  68.  
  69.  
  70.  
  71.  
  72. }
  73. echo '</tr>
  74. </tbody>
  75. </table>';
  76.  
  77.  
  78. }
nospor
Jak to mowia: znajdz 10 roznic
$id
$nid

wink.gif

A na przyszlosc patrz jak nazywasz zmienne w roznych miejscach tongue.gif
sledzik
dalo sie to tez rozwiazac tak:
'id' =>$r['news_id'],

tongue.gif

ale chyba moje rozwiazanie jest bardziej na okretke, i oczywiscie zbedne , dziekuje.


a nid wziolem z

$nid = $r['news_id'];

i gupio myslalem ze to zaskoczy..
nospor
No skoro id masz w index, to wystarczy sie wlasnie do niego dobrac. Ale trzeba pamietac jak sie nazwalo zmienna sklerotyku jeden tongue.gif
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.