Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrócenie zapytania SQL
Forum PHP.pl > Forum > Bazy danych > MySQL
Tomplus
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ąć.

trueblue
A tak?
  1. LEFT JOIN `atrybuty` a ON a.`towar_id` = t.`id` AND a.`atrybut_id` IN (1,2,3)
Tomplus
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
Crozin
Czyli standardowe pocdejście przy pracy z RDBMS-ami. Po stronie aplikacji będziesz musiał sobie spleść z tego porządaną strukturę.
Pyton_000
Najwygodniej to pobrać produkt, potem pobrać wszystkie properties do niego i tyle. 2 zapytania smile.gif
Tomplus
Czyli albo tak jak jest teraz, albo z dodatkową usługą obsługi zapytań. Mówi się trudno.
Dzięki.
trueblue
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


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-2019 Invision Power Services, Inc.