Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]połączenie dwóch tabel
casperii
post
Post #1





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

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


Panowie mam pytanie odnośnie pobierania informacji z dwóch tabel , jak to wykonać optymalnie ?

tabela: grupa:
id, grupa
1 klienci
2 sprzedawcy
3 inni

tabela uzytkownicy
id, user, grupa
1 czesiek, klienci
2 franek , klienci
3 staszek, sprzedawcy
4 zygmunt, klienci

teraz chce wyświetlić wszystko z tabelki grupa
  1. select * from grupa


powyższe zapytanie wyświetli mi
klienci
sprzedawca

a Ja chciałbym osiągnąć taki schemat:
klienci:
czesiek, franek, zygmunt
sprzedawcy:
staszek

ktoś podpowie ? Oczywiście tych grup może być bardzo dużo , chodzi mi raczej o zrozumienie tego.

Nie wiem , czy w dobrą stronę idę:

  1. SELECT * FROM `uzytkownicy` AS `u` WHERE `u`.`grupa` IN ( SELECT g.grupa FROM grupa g WHERE `u`.`grupa` = `g`.`grupa` )


teraz wyświetla mi to co ma powiązania w dwóch tabelach i nie mam tak jak by nagłówka grupy.

klienci:
czesiek, franek, zygmunt
sprzedawcy:
staszek
inni:

kolor pogrubiony czarny - to pokazuje
kolor czerwony - tego nie pokazuje a chce by też pokazywało nawet jeśli nie ma relacji
kolor fioletowy - tego też nie pokazuje gdyż w tabeli klienci nie ma powiązania , a chce by też wyświetlało.

Ewentualnie jak to zrobić w php ?

Ten post edytował casperii 5.06.2018, 01:01:26
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
Neutral
post
Post #2





Grupa: Zarejestrowani
Postów: 286
Pomógł: 46
Dołączył: 10.01.2016

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


MariaDB [casperii]> select * from users;
+----+---------+---------+
| id | user | col2 |
+----+---------+---------+
| 1 | czesiek | clients |
| 2 | franek | clients |
| 3 | staszek | seller |
| 4 | staszek | clients |
+----+---------+---------+

  1. SELECT clients,seller,other FROM (SELECT (case when col2='clients' then user end) AS clients
  2. , (case when col2='seller' then user end) AS seller
  3. , (case when col2='other' then user end) AS other FROM users) AS derived_table;


+---------+---------+-------+
| clients | seller | other |
+---------+---------+-------+
| czesiek | NULL | NULL |
| franek | NULL | NULL |
| NULL | staszek | NULL |
| staszek | NULL | NULL |
+---------+---------+-------+
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #3





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Źle się za to zabierasz. Powiedz dokładnie co chcesz zrobić. Dlaczego nie wystarczy Ci zwyczajny JOIN z użytkownikami posortowanymi według grupy? Ewentualnie możesz pomyśleć o użyciu GROUP_CONCAT.
Go to the top of the page
+Quote Post
casperii
post
Post #4





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

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


@SmokAnalog efekt który chce osiągnąć ma być na zasadzie kategorii i wyświetlonej liście produktów

czyli zakładamy , że mamy dwie tabele:

tabelka kategorie
id, kategoria, nazwałączenia
1. Komputery , KMP-1
2. RTV , RTV-2
3. Motoryzacja, MOT-3

tabelka produkty
id, nazwa, nazwałączenia, cośtam coś
1. Romet, MOT-3, okazja
2. Laptop, KMP-1, promocja
3. Telewizor, RTV-2, wyprzedaż
4. DVD, RTV-2, okazja

Chce mieć listę na wzór

Komputery (1):
-Laptop okazja

Motoryzacja (1):
-Romet, okazja

RTV (2):
-Telewizor, wyprzedaż
-DVD, okazja

i teraz tak sobie przemyślałem, że to jednak trzeba by było zrobić na zasadzie PHP. Masz pomysł ?

Ten post edytował casperii 5.06.2018, 18:59:03
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #5





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Tak myślałem. Ludzie często mylą format wyświetlania z formatem danych.

Pobierz te rekordy normalnie odpowiednio posortowane i w PHP sobie pogrupuj według danej kolumny (polecam array_reduce). Albo po prostu iteruj te wyniki sprawdzając co krok czy grupa się zmieniła. Jak się zmieniła, to wyświetl nagłówek. Pseudokod:

  1. Ustaw $grupę na null.
  2. Dla każdego wiersza z bazy:

    1. Jeżeli grupa z wiersza jest różna od $grupy, pokaż nagłówek grupy.
    2. Pokaż wiersz.


Ten post edytował SmokAnalog 5.06.2018, 19:53:11
Go to the top of the page
+Quote Post
casperii
post
Post #6





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

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


@SmokAnalog dzięki za podpowiedź, a czy mógłbyś mi rozpisać schemat?

na pewno select * kategorie order by kategoria ASC
i co dalej foreach i w nim odwołanie do każdej kategorii dla drugiej tabelki ?
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #7





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Zwykły LEFT JOIN.

Albo może zrób sobie po prostu dwa osobne zapytania? Zbierz kategorie do tablicy, potem zrób tak:

  1. $categories = array_map(function ($category) {
  2. $category->products = [];
  3. }, array_combine(array_column($categories, 'id'), $categories));


I w końcu albo w array_map, albo w pętli (żeby oszczędzić pamięć) połącz poszczególne produkty z kategoriami:

  1. $categories[$product->category_id]->products[] = $product;


Sposobów jest mnóstwo. Wykonasz albo jedno, albo dwa zapytania. Skłaniałbym się nawet lekko ku dwóm.
Go to the top of the page
+Quote Post
casperii
post
Post #8





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

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


@SmokAnalog czyli że tak? :


  1. $sql = $pdo->prepare("select * from `kategorie` ORDER BY `kategoria` ASC");
  2. $sql2 = $pdo->prepare("select * from `produkty` ORDER BY `nazwa` ASC");
  3. try {
  4. $sql->execute();
  5. $row = $sql->fetchAll(PDO::FETCH_OBJ);
  6.  
  7. $sql2->execute();
  8. $row2 = $sql2->fetchAll(PDO::FETCH_OBJ);
  9.  
  10. $categories = array_map(function ($category) { // $category to jest nasz array czyli $row ?
  11. $category->products = [];
  12. }, array_combine(array_column($categories, 'id'), $categories));
  13.  
  14. while(){ // co powinienem wsadzić w tym przypadku do pętli while ?
  15. $categories[$product->category_id]->products[] = $product; //$product to nasze $row2 ?
  16. }
  17.  
  18. }catch(PDOException $e){
  19. echo $e->getMessage();
  20.  
  21. }


Ten post edytował casperii 6.06.2018, 12:28:39
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #9





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Kategorie sobie pobierz z $sql->fetchAll(PDO::FETCH_OBJ). Zakładam, że te dane nie idą w jakieś grube tysiące, bo jeśli idą, to warto rozważyć fetch wiersz po wierszu.
Go to the top of the page
+Quote Post
casperii
post
Post #10





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

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


Wolałbym wybiegać w przyszłość i zakładać , że może być kategorii 10000 smile.gif
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #11





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Będziesz miał stronę, która będzie pokazywała 10000 kategorii naraz?
Go to the top of the page
+Quote Post
casperii
post
Post #12





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

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


No może 10000 kategorii to gruba przesada oneeyedsmiley02.png ale myśle, że max 500 to może się uzbierać
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #13





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Ja bym to raczej wrzucił do tablicy zamiast fetchować, bo wygodniej się będzie na tym pracowało. Rozumiesz ideę? Chcemy zrobić tablicę kategorii, gdzie każda kategoria ma właściwość products, będącą tablicą jej produktów. Wtedy w widoku możesz elegancko iterować te kategorie i produkty każdej z nich.
Go to the top of the page
+Quote Post
casperii
post
Post #14





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

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


@SmokAnalog czyli, że w ten sposób?:

  1.  
  2. $sql = $pdo->prepare("select * from `kategorie` ORDER BY `kategoria` ASC");
  3. $kategorie = $sql->fetchAll(PDO::FETCH_OBJ)
  4.  
  5. $sql2 = $pdo->prepare("select * from `produkty` ORDER BY `nazwa` ASC");
  6. $produkty = $sql->fetchAll(PDO::FETCH_OBJ)


i że powyższe teraz wrzucić w to?:

  1. $categories = array_map(function ($category) {
  2. $category->products = [];
  3. }, array_combine(array_column($categories, 'id'), $categories));


Ten post edytował casperii 6.06.2018, 13:49:07
Go to the top of the page
+Quote Post
nospor
post
Post #15





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




Tutaj
http://nospor.pl/grupowanie-wynikow.html
masz pokazane na dokladnie takim samym przykladzie co u ciebie: kategorie -> produkty


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

"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

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: 20.08.2025 - 21:50