Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Listowanie wyników
Kużdo
post
Post #1





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Witam,

Nie wiedziałem jak dokładnie temat nazwać, bo jest dosyć skomplikowany... Otóż mam dwie tabele: 'characters' i 'accounts'. W tabeli 'characters' mam kolumnę 'online', a w tabeli accounts 'lastip'. Zmiana tabel nie wchodzi w grę.

I teraz o co się rozchodzi:
1) Trzeba pobrać wszystkie wpisy z 'characters', które posiadają wartość '1' w 'online' - proste.
2) Następie pobrać wszystkie wpisy z tabeli 'accounts' na podstawie zmiennej z 'characters' - proste.
3) I tutaj zaczynają się schody... Trzeba pogrupować wyniki z 'accounts' na podstawie 'lastip' w grupy - nie wiem jak to wykonać, bo 'lastip' znajduje się w 'accounts'.
4) Dalej to już listowanie na stronie wyników w grupach, więc to będzie proste...

Nie mam pojęcia jak rozwiązać pkt 3 i tutaj moja prośba o pomoc. Jakąkolwiek...

Pozdrawiam i z góry dziękuję.

Ten post edytował kuzdo 9.08.2010, 13:59:51
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
toel
post
Post #2





Grupa: Zarejestrowani
Postów: 97
Pomógł: 11
Dołączył: 2.02.2010

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


Jeśli dobrze zrozumiałem to o to Ci chodzi

  1. SELECT
  2. a.*
  3. FROM
  4. accounts a
  5. JOIN
  6. characters c
  7. ON
  8. c.IDENTYFIKATOR_ŁĄCZĄCY_WPISY=a.IDENTYFIKATOR_ŁĄCZĄCY_WPISY
  9. WHERE
  10. c.online='1'
  11. GROUP BY
  12. a.lastip

Go to the top of the page
+Quote Post
Kużdo
post
Post #3





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Jakbyś mi jeszcze powiedział co to dokładnie robi (IMG:style_emoticons/default/tongue.gif)

SELECT a.* - rozumiem że pobranie wszystkich danych ale po co te 'a.'?
FROM accounts a - pobranie z accounts i nadanie aliasu 'a' ?
Go to the top of the page
+Quote Post
toel
post
Post #4





Grupa: Zarejestrowani
Postów: 97
Pomógł: 11
Dołączył: 2.02.2010

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


SELECT a.* pobiera wszystkie dane z accounts bo zrozumiałem, że właśnie tylko te dane chcesz. jeśli mają być wszystkie (z tabeli characters też) to olej to 'a.'
I tak - 'a' to po prostu alias nadany przy FROM accounts a.

Możesz nazwać to inaczej ew. używać pełnych nazw tabel (IMG:style_emoticons/default/smile.gif)


------------
[edit]

JOIN


A co robi napisany wcześniej kod?
Łączy dwie tabele, pobiera z nich dane (które chcesz - w moim kodzie pobiera tylko te z accounts jak zauważyłeś) , z warunkiem, że muszą być online, a następnie grupuje po lastid.

Ten post edytował toel 9.08.2010, 14:23:02
Go to the top of the page
+Quote Post
Kużdo
post
Post #5





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Aha rozumiem. Ale teraz inna sprawa, która mi się przypomniała, bo już chciałem to sprawdzać (IMG:style_emoticons/default/haha.gif) Nie można tak tego łączyć bo obie tabele są w osobnych bazach, na osobnych maszynach...
Więc jest połączenie $link1 do accounts i $link2 do characters...
Go to the top of the page
+Quote Post
toel
post
Post #6





Grupa: Zarejestrowani
Postów: 97
Pomógł: 11
Dołączył: 2.02.2010

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


No to może zrób w ten sposób:
(raczej średnio wydajne, ale może Ci wystarczy, dopóki, ktoś nie podrzuci innego rozwiązania (IMG:style_emoticons/default/winksmiley.jpg) )


Najpierw pobierz z tabeli characters do jednej zmiennej wszystkie ID łączące tabele i oddziel je przecinkami (dajmy na to zmienna nazywa się $ids)

Następnie wykonaj takie zapytanie

  1. SELECT
  2. *
  3. FROM
  4. accounts
  5. WHERE
  6. Id IN($ids)
  7. GROUP BY
  8. lastip
Go to the top of the page
+Quote Post
Kużdo
post
Post #7





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Dobra, doszedłem już do czegoś, według tego co podałeś, ale teraz mam inny problem.
Zapytanie wygląda tak:
  1. SELECT `login`, `accessLevel`, `lastIP`, `pcIp` FROM `accounts` WHERE `login` IN ($ids) GROUP BY `lastIP`

I przy listowaniu tego na stronie, podawany jest tylko pierwszy wpis kolumny login. Więc jeżeli są przykładowo 4 wpisy z tym samym lastIP, ale o loginach damian, daniel, adam, kasia, to zostanie wyświetlony tylko pierwszy wpis... Reszta jest pomijana... Co zrobić?

Ten post edytował kuzdo 10.08.2010, 18:05:29
Go to the top of the page
+Quote Post
skarabe.pl
post
Post #8





Grupa: Zarejestrowani
Postów: 142
Pomógł: 49
Dołączył: 29.07.2010

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


  1. SELECT `login`, `accessLevel`, `lastIP`, `pcIp` FROM `accounts` WHERE `login` IN ($ids) GROUP BY `lastIP`, `login`
Go to the top of the page
+Quote Post
Kużdo
post
Post #9





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Wielkie dzięki (IMG:style_emoticons/default/biggrin.gif) Ja już kombinowałem z GROUP_CONCAT(`login`) itp. a tu takie proste rozwiązanie (IMG:style_emoticons/default/haha.gif) Nawet o tym nie pomyślałem...

Ale teraz w sumie mam inny problem :/

Przykładowo dostaje takie dane:
Kod
account | lvl | lastIP | pcIP
-------------------------------------------------------
konto1 | 0 | 111.111.11.11 | 192.168.1.2 |
konto2 | 0 | 111.111.11.11 | 192.168.1.2 |
konto3 | 0 | 111.111.11.11 | 192.168.1.3 |
innekonto | 0 | 222.222.22.22 | 192.168.1.2 |
kontoinne | 0 | 333.333.33.33 | 192.168.1.2 |
jakies | 0 | 444.444.44.44 | 192.168.1.2 |
test1 | 0 | 555.555.55.55 | 192.168.2.3 |
test2 | 0 | 555.555.55.55 | 192.168.2.3 |


I na stronie chce je wypisać w pewien specyficzny sposób, otóż miałaby to być tabela w której tylko raz pojawiałoby się dane lastIP, a obok niego wszystkie wpisy z tego IP. Wiem, że muszę to zrobić, przez porównywanie jednego wpisu z drugim, ale nie wiem jak zacząć i jak przeskakiwać do kolejnego IP...

Ten post edytował kuzdo 11.08.2010, 22:49:18
Go to the top of the page
+Quote Post
skarabe.pl
post
Post #10





Grupa: Zarejestrowani
Postów: 142
Pomógł: 49
Dołączył: 29.07.2010

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


No w takiej sytuacji to GROUP_CONCAT nie jest takie głupie - miałbyś od razu wszystkie loginy oddzielone przecinkami i po jednym IP na wiersz. Ale jeśli z jakichś powodów to niemożliwe, to możesz zrobić w taki sposób:
  1. $prevIp = '';
  2. echo '<table>'
  3. while ($row = mysql_fetch_assoc($result)) {
  4. if ($prevIp <> $row['lastIP']) {
  5. if (!empty($prevIp)) {
  6. echo '</td></tr>';
  7. }
  8. $prevIp = $row['lastIP'];
  9. echo '<tr><td>' . $row['lastIP'] . '</td><td>';
  10. } else {
  11. echo '<br />';
  12. }
  13. echo $row['login'];
  14. }
  15. echo '</td></tr></table>';
Go to the top of the page
+Quote Post
Kużdo
post
Post #11





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Wielkie dzięki, powinienem piwo postawić, ale nie mam jak (IMG:style_emoticons/default/haha.gif)

Mam tylko jedno pytanie: Co to za operator porównania:
Kod
($prevIp <> $row['lastIP'])

On działa, ale ja go nie znam (IMG:style_emoticons/default/haha.gif) Pierwszy raz taki widzę...

Ten post edytował kuzdo 12.08.2010, 07:14:37
Go to the top of the page
+Quote Post
skarabe.pl
post
Post #12





Grupa: Zarejestrowani
Postów: 142
Pomógł: 49
Dołączył: 29.07.2010

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


http://pl2.php.net/manual/en/language.oper....comparison.php

Ale i tak przepraszam - za dużo ostatnio grzebię w SQL i mi się pomieszało. W twoim skrypcie lepszym operatorem będzie !== (not identical).
Go to the top of the page
+Quote Post
Kużdo
post
Post #13





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Jeszcze mały problem... Co mam zrobić, jeżeli kolumn ma być więcej... W tym momencie "echo <br>" psuje tabelę...

Chciałbym uzyskać taki efekt i nie wiem teraz jak to rozwiązać. http://img843.imageshack.us/img843/5867/tabelax.png
Go to the top of the page
+Quote Post
skarabe.pl
post
Post #14





Grupa: Zarejestrowani
Postów: 142
Pomógł: 49
Dołączył: 29.07.2010

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


No to zmieniamy taktykę, pierwsza pętla:
  1. $data = array();
  2. while ($row = mysql_fetch_assoc($result)) {
  3. if (!isset($data[$row['lastIP']])) {
  4. $data[$row['lastIP']] = array();
  5. }
  6. $data[$row['lastIP']][] = $row;
  7. }

No i druga:
  1. echo '<table>';
  2. foreach ($data as $lastIp => $row) {
  3. echo '<tr><td rowspan="' . count($row) . '">', $lastIp, '</td>';
  4. for ($i = 0;isset($row[$i]);++$i) {
  5. if ($i !== 0) {
  6. echo '<tr>';
  7. }
  8. '<td>', $row[$i]['login'], '</td>',
  9. '<td>', $row[$i]['nick'], '</td>',
  10. '<td>', $row[$i]['lvl'], '</td>',
  11. '<td>', $row[$i]['pcIP'], '</td>',
  12. '</tr>';
  13. }
  14. }
  15. echo '</table>';


Ten post edytował skarabe.pl 12.08.2010, 19:30:10
Go to the top of the page
+Quote Post
Kużdo
post
Post #15





Grupa: Zarejestrowani
Postów: 181
Pomógł: 14
Dołączył: 4.06.2008

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


Ooo wielkie dzięki (IMG:style_emoticons/default/biggrin.gif) Teraz już wszystko jest cacy (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.09.2025 - 17:46