Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][SQL]Łączenie zapytań
sledzik
post
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


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. ";


Ten post edytował sledzik 1.02.2016, 20:48:09
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 29)
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


  1. ON sos_categories.categories_id = sos_categories.categories_id


Czym się różnią tabele categories oraz news_categories?
Go to the top of the page
+Quote Post
sledzik
post
Post #3





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


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


Ten post edytował sledzik 1.02.2016, 21:24:00
Go to the top of the page
+Quote Post
trueblue
post
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Wskazałem Ci błąd.
Go to the top of the page
+Quote Post
sledzik
post
Post #5





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


no ok ale szkopul w tym ze w tabeli news nie ma zadnego nawiazania do categories wiec nie moge chyba jako tak uzyc JOIN?
Go to the top of the page
+Quote Post
trueblue
post
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


No, więc łączysz je przez news_categories.
Go to the top of the page
+Quote Post
sledzik
post
Post #7





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


kurde nie rozumiem , dalbys mi strone gdzie sa jakies przyklady lub napisal jakies przykladowe zapytanie jesli nie to
Go to the top of the page
+Quote Post
com
post
Post #8





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


no żeby coś załączyć musisz mieć element wspólny(klucz), na tym polegają relacyjne bazy danych (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
sledzik
post
Post #9





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


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?
Go to the top of the page
+Quote Post
trueblue
post
Post #10





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Łą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.
Go to the top of the page
+Quote Post
sledzik
post
Post #11





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


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. }
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Musis wpierw pogrupowac dane a potem wyswietlac jak ci pasuje
http://nospor.pl/grupowanie-wynikow.html
Go to the top of the page
+Quote Post
sledzik
post
Post #13





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


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



Ten post edytował sledzik 2.02.2016, 23:38:58
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.
Go to the top of the page
+Quote Post
sledzik
post
Post #15





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


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

Ten post edytował sledzik 2.02.2016, 23:01:24
Go to the top of the page
+Quote Post
nospor
post
Post #16





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




skoro chcesz grupowac po newsach to masz odwrocic sytuacje niz ja podalem w arcie. Ja ta grupowalem po kategoriach.
Go to the top of the page
+Quote Post
sledzik
post
Post #17





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


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..?
Go to the top of the page
+Quote Post
nospor
post
Post #18





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Go to the top of the page
+Quote Post
sledzik
post
Post #19





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


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>';
Go to the top of the page
+Quote Post
nospor
post
Post #20





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Kod wyswietlajacy ma byc poza petla WHILE a nie w petli WHILE
Go to the top of the page
+Quote Post
sledzik
post
Post #21





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


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

Ten post edytował sledzik 3.02.2016, 00:13:08
Go to the top of the page
+Quote Post
nospor
post
Post #22





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Najpierw przygotowujesz dane do wyswietlania, potem dopiero dane wyswietlasz. To sie nazywa oddzielenie logiki od widoku
Go to the top of the page
+Quote Post
sledzik
post
Post #23





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


Nie da sie tego jakos prosciej zrobic zapytaniami sql?(dzielac na dwa zapytania)?
Nie wiem jak z wydajnoscia potem tego..

Ten post edytował sledzik 3.02.2016, 12:07:59
Go to the top of the page
+Quote Post
nospor
post
Post #24





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Czytamy jeszcze raz ze zrozumieniem:
najpierw logika, potem wyswietlanie. Tak sie robi w normalnych aplikacjach. poczytaj o MVC jak mi nie wierzysz.
Go to the top of the page
+Quote Post
sledzik
post
Post #25





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


wierze, wierze.. tylko MVC to kod obiektowy , a mi wystarczy napisac to strukturalnie
Go to the top of the page
+Quote Post
nospor
post
Post #26





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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?
Go to the top of the page
+Quote Post
sledzik
post
Post #27





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


Nie spokojnie (IMG:style_emoticons/default/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. }
Go to the top of the page
+Quote Post
nospor
post
Post #28





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jak to mowia: znajdz 10 roznic
$id
$nid

(IMG:style_emoticons/default/wink.gif)

A na przyszlosc patrz jak nazywasz zmienne w roznych miejscach (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
sledzik
post
Post #29





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 1.02.2016

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


dalo sie to tez rozwiazac tak:
'id' =>$r['news_id'],

(IMG:style_emoticons/default/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..

Ten post edytował sledzik 3.02.2016, 13:51:31
Go to the top of the page
+Quote Post
nospor
post
Post #30





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No skoro id masz w index, to wystarczy sie wlasnie do niego dobrac. Ale trzeba pamietac jak sie nazwalo zmienna sklerotyku jeden (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 22.08.2025 - 19:57