Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [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
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 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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 23:13