Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Samozłaczenie tabel - czy dobrze zrobione
Forum PHP.pl > Forum > Bazy danych > MySQL
neotec
Mam przykładową tabelę z cechami produktu:

ID | klucz | wartosc
nokia-6300 | Radio | Tak
....


Korzystam z poniższego samo złączenia aby wyjąć określone cechy i zbudować z nich kolumny:

Kod
SELECT
c1.ID, c1.wartosc as Bluetooth, c2.wartosc as Aparat, c3.wartosc as MP3, c4.wartosc as Radio
FROM cechy as c1
LEFT JOIN cechy as c2 ON c1.ID = c2.ID AND c2.klucz = 'Aparat fotograficzny'<BR>LEFT JOIN cechy as c3 ON c1.ID = c3.ID AND c3.klucz = 'Odtwarzacz mp3'
LEFT JOIN cechy as c4 ON c1.ID = c4.ID AND c4.klucz = 'Radio'

WHERE <BR>c1.klucz = 'Bluetooth' and<BR>c1.ID in ('nokia-6300', 'motorola-v3')



Dwa pytania:
- gdzie powinien znaleźć się warunek dotyczący pierwszej cechy c1.klucz
w części ON czy w WHERE?
- a może wszystkie c1.klucz, c2.klucz... powinny być w WHERE?questionmark.gif
- jak to zoptymalizować? bo dla 10 cech skutecznie to całkowicie zamula
mojego starego koma?

SELECT
c1.ID, c1.wartosc as Bluetooth, c2.wartosc as Aparat, c3.wartosc as MP3, c4.wartosc as Radio
FROM
cechy as c1
LEFT JOIN cechy as c2 ON c1.ID = c2.ID AND c2.klucz = 'Aparat fotograficzny'
LEFT JOIN cechy as c3 ON c1.ID = c3.ID AND c3.klucz = 'Odtwarzacz mp3'
LEFT JOIN cechy as c4 ON c1.ID = c4.ID AND c4.klucz = 'Radio'
WHERE
c1.klucz = 'Bluetooth' and
c1.ID in ('nokia-6300', 'motorola-v3')
tommy4
Nie wiem czy dobrze zrozumiałem, ale chyba lepiej trochę przerobić kod (dla przykładu php), a zapytanie wykonać tak:

  1. SELECT cechy.ID, cechy.wartosc, cechy.klucz FROM cechy WHERE cechy.ID IN ('nokia-6300', 'motorola-v3');


a pozniej
  1. <?php
  2. $telefon = array();
  3. while($row = mysql_fetch_assoc($sql))
  4. {
  5. $telefon[$row['ID']][$row['klucz']] = $row['wartosc'];
  6. }
  7. print_r($telefon);
  8. ?>
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-2025 Invision Power Services, Inc.