Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dynamiczne kolumny w mysql
Forum PHP.pl > Forum > Bazy danych > MySQL
kepas
Witam

Czy ktos moglby mi podpowiedziec jak skonstruowac zapytanie SELECT i czy jest to mozliwe aby otrzymac dynamiczne kolumny? Posluze sie przykladem:
Mamy Tabice pierwsza: identyfikator, oraz kto wysyla i kto odbiera.
Tablica_1
ID
sender
receiver
1 A A
2 A B
3 A C
4 B B
5 B C
6 C A

Tablica 2 posiada klucz obcy odwolujacy sie do tablicy pierwszej oraz kod bledu i ilosc wystapien. Problem jest ze nieznana jest liczba mozliwych kodow bledu oraz mozliwosc wystapienia kilku bledow dla jednego wiersza z Tabeli 1. Tak jak w przykladzie dla B B wystapilo 5 bledow o kodzie 403 i 2 bledy 302.
Tablica_2
ID
error_code
count
4 403 5
4 302 2
6 403 1

Wyniki chcialbym uzyskac w takiej postaci:
ID sender receiver 403 302
1 A A 0 0
2 A B 0 0
3 A C 0 0
4 B B 5 2
5 B C 0 0
6 C A 1 0

Z gory dziekuje za pomoc.
Norbas
Należy zastosować funkcję COUNT i złączenie LEFT JOIN
kepas
Robilem left join da wynik:
1 A A
2 A B
3 A C
4 B B 403 5
4 B B 302 2
5 B C
6 C A 403 1

A mnie chodzi zeby dalo:
ID s r 403 302
1 A A
2 A B
3 A C
4 B B 5 2
5 B C
6 C A 1 0
czyli te kody bledow staly sie kolumnami.
da sie ? jakis pomysl ?
Norbas
  1. SELECT t1.id,sender,receiver,COUNT(t2a.id),COUNT(t2b.id)
  2. FROM tablica1 AS t1
  3. LEFT JOIN tablica2 AS t2a ON (t2a.id=t1.id AND t2a.error_code=403)
  4. LEFT JOIN tablica2 AS t2b ON (t2b.id=t1.id AND t2b.error_code=302)
  5. GROUP BY t1.id
kepas
To rozwiazanie bardzo mi pomaga.
Jedyny problem jaki pozostaje to ze nigdy nie wiem jaki bedzie error_code wiec nie moge go na sztywno wpisac w zapytanie. Istnieje sposob aby dodawac te LEFT JOINy jakos dynamicznie czy to juz musze zrobic w PHP?
Norbas
Można wykonać zapytanie z grupowaniem również wg kodu błędu:
  1. SELECT t1.id,sender,receiver,t2.error_code,COUNT(t2.id)
  2. FROM tablica1 AS t1
  3. LEFT JOIN tablica2 AS t2 ON t2.id=t1.id
  4. GROUP BY t1.id,t2.error_code

Ale wtedy wyniki dostaniesz w tym formacie, co nie chciałeś mieć na początku.
Kolejny sposób, to wykonanie jednego zapytania o kody błędów, które znajdują się w tablicy 'tablica2':
  1. SELECT DISTINCT error_code FROM tablica2

i zbudowanie zapytania z zastosowaniem wyników, które otrzymasz z powyższego zapytania. Coś w stylu:
Kod
$result = mysql_query('SELECT DISTINCT error_code FROM tablica2');
if ($result) {
  $sql_select = '';
  $sql_join = '';
  $i = 2;
  while($row = mysql_fetch_assoc($result)) {
    $sql_select .= ",COUNT(t$i.id) AS error" . $row['error_code'];
    $sql_join .= " LEFT JOIN tablica2 AS t$i ON (t$i.id=t1.id AND t$i.error_code=' . $row['error_code'] . ')';
    ++$i;
  }
  if ($sql_join) {
    $sql = "SELECT t1.id,sender,receiver$sql_select FROM tablica1 AS t1$sql_join";
    // wykonanie zapytania i odczytanie wyników
  }
}
kepas
Dokladnie tak zrobilem smile.gif
Dzieki wielkie za pomoc smile.gif
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.