Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Skrócenie zapytania SQL, czyli "dynamiczna" obsługa podzapytań
Tomplus
post 26.09.2017, 08:40:26
Post #1





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


Mam zapytanie następujące:
  1. SELECT
  2. t.`symbol_id`, t.`price`, t.`stock`,
  3. a.`wartosc` masa, b.`wartosc` kolor, c.`wartosc` material
  4. FROM `towary` t
  5. LEFT JOIN `atrybuty` a ON a.`towar_id` = t.`id` AND a.`atrybut_id` = 1
  6. LEFT JOIN `atrybuty` b ON b.`towar_id` = t.`id` AND b.`atrybut_id` = 2
  7. LEFT JOIN `atrybuty` c ON c.`towar_id` = t.`id` AND c.`atrybut_id` = 3
  8. WHERE t.`product_id` = ?
  9. ORDER BY t.`symbol_id` ASC


Zapytanie jest poprawne, znaczy wyświetla to co oczekuje, tak jak oczekuję. Na tą chwilę.
Jednak nie podoba mi się forma przedstawienia dołączeń do atrybutów, czyli wiele LEFT JOINów do tej samej tabeli.

Chciałbym się dowiedzieć czy jest jakieś inne rozwiązanie, które skróciloby takie zapytanie, bo jeżeli w przyszłości dotarłyby kolejne atrybuty, to należałoby rozszerzyć zapytanie o kolejnego LEFTa, a chciałbym tego uniknąć.

Go to the top of the page
+Quote Post
trueblue
post 26.09.2017, 08:45:20
Post #2





Grupa: Zarejestrowani
Postów: 6 800
Pomógł: 1827
Dołączył: 11.03.2014

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


A tak?
  1. LEFT JOIN `atrybuty` a ON a.`towar_id` = t.`id` AND a.`atrybut_id` IN (1,2,3)


--------------------
Go to the top of the page
+Quote Post
Tomplus
post 26.09.2017, 10:22:27
Post #3





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


Nie.

To daje 3 rekordy na każdy towar.

Zamiast:
A1, A2, A3
B1, B2, B3
C1, C2, C3

mam
A1
A2
A3
B1
B2
B3
C1
C2
C3
Go to the top of the page
+Quote Post
Crozin
post 26.09.2017, 11:05:47
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Czyli standardowe pocdejście przy pracy z RDBMS-ami. Po stronie aplikacji będziesz musiał sobie spleść z tego porządaną strukturę.
Go to the top of the page
+Quote Post
Pyton_000
post 26.09.2017, 11:25:22
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Najwygodniej to pobrać produkt, potem pobrać wszystkie properties do niego i tyle. 2 zapytania smile.gif
Go to the top of the page
+Quote Post
Tomplus
post 26.09.2017, 11:40:29
Post #6





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


Czyli albo tak jak jest teraz, albo z dodatkową usługą obsługi zapytań. Mówi się trudno.
Dzięki.
Go to the top of the page
+Quote Post
trueblue
post 26.09.2017, 11:51:24
Post #7





Grupa: Zarejestrowani
Postów: 6 800
Pomógł: 1827
Dołączył: 11.03.2014

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


Ok, rozumiem. Coś w rodzaju tabeli przestawnej.

Nie ma tu warunku na product_id, a grupowanie jest po id towaru.
  1. SELECT id,symbol_id,price,stock,max(masa),max(kolor),max(material) FROM(
  2. SELECT
  3. t.id,t.symbol_id, t.price, t.stock,
  4. IF(a.atrybut_id=1,a.wartosc,'') AS masa,
  5. IF(a.atrybut_id=2,a.wartosc,'') AS kolor,
  6. IF(a.atrybut_id=3,a.wartosc,'') AS material
  7. FROM towary AS t
  8. LEFT JOIN atrybuty a ON a.towar_id = t.id
  9. ORDER BY t.symbol_id ASC) AS tmp
  10. GROUP BY id


Ja otrzymuję taki wyniki, czyli chyba oczekiwany.
Cytat
id;symbol_id;price;stock;max(masa);max(kolor);max(material)
1;1;100;1;czerwony;1 kg;2 m
2;2;200;2;biały;;3 m




--------------------
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 Wersja Lo-Fi Aktualny czas: 23.06.2025 - 12:57