Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Listowanie wyników
Forum PHP.pl > Forum > Przedszkole
Kużdo
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ę.
toel
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

Kużdo
Jakbyś mi jeszcze powiedział co to dokładnie robi tongue.gif

SELECT a.* - rozumiem że pobranie wszystkich danych ale po co te 'a.'?
FROM accounts a - pobranie z accounts i nadanie aliasu 'a' ?
toel
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 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.
Kużdo
Aha rozumiem. Ale teraz inna sprawa, która mi się przypomniała, bo już chciałem to sprawdzać 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...
toel
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 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
Kużdo
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ć?
skarabe.pl
  1. SELECT `login`, `accessLevel`, `lastIP`, `pcIp` FROM `accounts` WHERE `login` IN ($ids) GROUP BY `lastIP`, `login`
Kużdo
Wielkie dzięki biggrin.gif Ja już kombinowałem z GROUP_CONCAT(`login`) itp. a tu takie proste rozwiązanie 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...
skarabe.pl
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>';
Kużdo
Wielkie dzięki, powinienem piwo postawić, ale nie mam jak haha.gif

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

On działa, ale ja go nie znam haha.gif Pierwszy raz taki widzę...
skarabe.pl
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).
Kużdo
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
skarabe.pl
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>';
Kużdo
Ooo wielkie dzięki biggrin.gif Teraz już wszystko jest cacy biggrin.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.