Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dynamiczne kolumny w mysql
kepas
post 20.06.2007, 18:31:17
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 20.06.2007

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


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.
Go to the top of the page
+Quote Post
Norbas
post 20.06.2007, 20:26:00
Post #2





Grupa: Zarejestrowani
Postów: 100
Pomógł: 1
Dołączył: 6.02.2006

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


Należy zastosować funkcję COUNT i złączenie LEFT JOIN


--------------------
Go to the top of the page
+Quote Post
kepas
post 20.06.2007, 21:45:37
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 20.06.2007

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


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 ?

Ten post edytował kepas 20.06.2007, 21:47:21
Go to the top of the page
+Quote Post
Norbas
post 20.06.2007, 22:42:22
Post #4





Grupa: Zarejestrowani
Postów: 100
Pomógł: 1
Dołączył: 6.02.2006

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


  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


--------------------
Go to the top of the page
+Quote Post
kepas
post 21.06.2007, 08:15:32
Post #5





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 20.06.2007

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


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?
Go to the top of the page
+Quote Post
Norbas
post 21.06.2007, 19:17:45
Post #6





Grupa: Zarejestrowani
Postów: 100
Pomógł: 1
Dołączył: 6.02.2006

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


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
  }
}


Ten post edytował Norbas 21.06.2007, 19:27:49


--------------------
Go to the top of the page
+Quote Post
kepas
post 22.06.2007, 09:44:47
Post #7





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 20.06.2007

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


Dokladnie tak zrobilem smile.gif
Dzieki wielkie za pomoc smile.gif
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: 19.06.2025 - 12:00