[MySQL] Zapytanie do phpBB pomocy !
Andrzej Kmicic - 27-12-2005 10:18
[MySQL] Zapytanie do phpBB pomocy !
Chciałbym wybrać ostatni post z każdego forum phpBB z osobna takim zapytaniem :
SELECT MAX(p.post_id) as maxpid,p.post_id,t.post_id, p.forum_id, FROM_UNIXTIME( p.post_time ) AS LastDate, p.poster_id, u.username, f.forum_name,t.post_text FROM phpbb_posts p, phpbb_users u, phpbb_forums f, phpbb_posts_text t WHERE p.post_id = t.post_id AND p.poster_id = u.user_id AND p.forum_id = f.forum_id AND f.auth_view = 0 GROUP BY f.forum_name ORDER BY maxpid DESC
ale coś jest zle wszystkie pola są ok oprócz pól "p.post_id, t.post_id" no i oczywiście "t.post_tekst" które są sobie równe ale nie są równe wartości maksymalnej grupowania.
Proszę o pomoc
Zyczę Zdrowych Wesołych i Udanych Świąt -- Andrzej Kmicic
Andrzej Kmicic - 27-12-2005 10:18
Użytkownik "Andrzej Kmicic" <delphiwsWYTNIJTO@poczta.onet.pl> napisał w wiadomości news:dojaac$lqs$1@nemesis.news.tpi.pl... > Chciałbym wybrać ostatni post z każdego forum phpBB z osobna takim zapytaniem > : > > SELECT MAX(p.post_id) as maxpid,p.post_id,t.post_id, p.forum_id, > FROM_UNIXTIME( p.post_time ) AS LastDate, p.poster_id, u.username, > f.forum_name,t.post_text > FROM phpbb_posts p, phpbb_users u, phpbb_forums f, phpbb_posts_text t > WHERE p.post_id = t.post_id > AND p.poster_id = u.user_id > AND p.forum_id = f.forum_id > AND f.auth_view = 0 > GROUP BY f.forum_name > ORDER BY maxpid DESC > > ale coś jest zle wszystkie pola są ok oprócz pól "p.post_id, t.post_id" no i > oczywiście "t.post_tekst" które są sobie równe ale nie są równe wartości > maksymalnej grupowania. >
Może wyjaśnię, chciałbym "wyciągnąć" z bazy phpBB zapytaniem (najlepiej pojedyńczym) informację o ostatnich zapytaniach i pogrupować je forami, tzn wyników jest tyle co for w phpBB. Dość łatwo to można zrobić zapytaniem :
Select SELECT MAX( p.post_id ) FROM phpbb_posts p GROUP BY p.forum_id
w wyniku otrzymujemy numery postów o maksymalnej wartości dla każdego z for. To działa ok ale szkopuł w tym że informacje o nazwie for, nazwie użytkownika, treści postu, nazwie wątku znajdują się w osobnych tabelach ale powiązanych z tabelą postów na której wykonałem grupowanie wg warosci maksymalnej id postu na każdym z for.
i tak treść postu związana jest parą pól : p.post_id = t.post_id
nazwa uzytkownika parą pól : p.poster_id = u.user_id
nazwa forum parą pól : p.forum_id = f.forum_id
tytuł wątku parą pól : p.topic_id = w.topic_id
dodatkowy warunek to aby forum było ogólnie dostępne a więc: f.auth_view = 0
czy da radę zrobić to jednym zapytaniem i powiązać znalezione maksima z danymi w innych tabelach.
Proszę ponownie o pomoc, ponieważ strasznie się zaparłem ale juz szału dostaję bo nic mi nie wychodzi jak grupuje to zle wiąże i na odwrót.
pozdrowienia Andrzej Kmicic
Piotr K - 27-12-2005 10:18
Andrzej Kmicic wrote: > Może wyjaśnię, chciałbym "wyciągnąć" z bazy phpBB zapytaniem (najlepiej > pojedyńczym) informację o ostatnich zapytaniach i pogrupować je forami, tzn > wyników jest tyle co for w phpBB. > Dość łatwo to można zrobić zapytaniem : > > Select > SELECT MAX( p.post_id ) > FROM phpbb_posts p > GROUP BY p.forum_id > > w wyniku otrzymujemy numery postów o maksymalnej wartości dla każdego z for. To > działa ok ale szkopuł w tym że informacje o nazwie for, nazwie użytkownika, > treści postu, nazwie wątku znajdują się w osobnych tabelach ale powiązanych z > tabelą postów na której wykonałem grupowanie wg warosci maksymalnej id postu na > każdym z for. > > i tak treść postu związana jest parą pól : > p.post_id = t.post_id > > nazwa uzytkownika parą pól : > p.poster_id = u.user_id > > nazwa forum parą pól : > p.forum_id = f.forum_id > > tytuł wątku parą pól : > p.topic_id = w.topic_id > > dodatkowy warunek to aby forum było ogólnie dostępne > a więc: f.auth_view = 0 > > czy da radę zrobić to jednym zapytaniem i powiązać znalezione maksima z danymi w > innych tabelach. > > > Proszę ponownie o pomoc, ponieważ strasznie się zaparłem ale juz szału dostaję > bo nic mi nie wychodzi jak grupuje to zle wiąże i na odwrót.
SELECT MAX(p.post_id) as maxpid, t.post_id, p.forum_id, FROM_UNIXTIME( p.post_time ) AS LastDate, p.poster_id, u.username, f.forum_name, t.post_text FROM phpbb_posts p, phpbb_users u, phpbb_forums f, phpbb_posts_text t WHERE p.post_id = t.post_id AND p.poster_id = u.user_id AND p.forum_id = f.forum_id AND f.auth_view = 0 GROUP BY f.forum_id HAVING MAX(p.post_id)= t.post_id ORDER BY maxpid DESC
Spróbowałbym czegoś jak to powyżej, chodzi o zastosowanie HAVING, jeśli nadal sobie z tym nie poradzisz wystaw na sieci strukturę tabel będzie prościej.
pozdrawiam piotr
Piotr K - 27-12-2005 10:18
> SELECT > MAX(p.post_id) as maxpid, > t.post_id, > p.forum_id, > FROM_UNIXTIME( p.post_time ) AS LastDate, > p.poster_id, > u.username, > f.forum_name, > t.post_text > FROM > phpbb_posts p, > phpbb_users u, > phpbb_forums f, > phpbb_posts_text t > WHERE p.post_id = t.post_id AND > p.poster_id = u.user_id AND > p.forum_id = f.forum_id AND > f.auth_view = 0 > GROUP BY f.forum_id > HAVING MAX(p.post_id)= t.post_id > ORDER BY maxpid DESC
mała errata, z WHERE znika "p.post_id = t.post_id"
WHERE p.poster_id = u.user_id AND p.forum_id = f.forum_id AND f.auth_view = 0
pzdr.
Andrzej Kmicic - 27-12-2005 10:18
Przesyłam strukturę tabel. Chcę wyciągnąć dane zaznaczone jako select z tabeli pogrupowanej wg maksymalnego post_id dla każdego forum_id. Jakby struktura w outlooku się pochrzaniła trzeba skopiować do notatnika jeżeli ma czcionki o stałej szerokości.
tabela : phpbb_posts as p +-----------------+-----------------------+ | Field | Type | +-----------------+-----------------------+ | post_id | mediumint(8) unsigned |---------+ <- MAX(post_id) | topic_id | mediumint(8) unsigned | | GROUP BY forum_id | forum_id | smallint(5) unsigned |-----+ | | poster_id | mediumint(8) |-------+ | | post_time | int(11) | | | | <- select | poster_ip | varchar(8) | | | | +-----------------+-----------------------+ | | | tabela : phpbb_forums as f | | | +--------------------+-----------------------+ | | | | Field | Type | | | | +--------------------+-----------------------+ | | | | forum_id | smallint(5) unsigned | -+ | | | forum_name | varchar(150) | | | <- select | auth_view | tinyint(2) | | | +--------------------+-----------------------+ | | tabela : phpbb_users as u | | +-----------------------+-----------------------+ | | | Field | Type | | | +-----------------------+-----------------------+ | | | user_id | mediumint(8) |-+ | | user_active | tinyint(1) | | | username | varchar(25) | | <- select +-----------------------+-----------------------+ | tabela : phpbb_posts_text as t | +--------------+-----------------------+ | | Field | Type | | +--------------+-----------------------+ | | post_id | mediumint(8) unsigned |------------+ | bbcode_uid | varchar(10) | | post_subject | varchar(60) | | post_text | text | <- select +--------------+-----------------------+
Dziwne ale poprzednie zapytanie po 7 sekundach wypluło pusty wynik. a juz myslałem że zadziała :)
dzięki za już -- Andrzej Kmicic
Andrzej Kmicic - 29-12-2005 14:33
uprościłem zapytania do 2 tabel i co to robi z Having :
mysql> Select -> Max(p.post_id) as maxid, -> p.post_time, -> p.forum_id, -> t.post_id -> From -> phpbb_posts p, -> phpbb_posts_text t -> Where p.post_id = t.post_id -> Group by p.forum_id -> HAVING maxid=t.post_id -> ; +-------+------------+----------+---------+ | maxid | post_time | forum_id | post_id | +-------+------------+----------+---------+ | 342 | 1069826479 | 6 | 342 | +-------+------------+----------+---------+ 1 row in set (0.01 sec)
a bez Having tak robi :
mysql> Select -> Max(p.post_id) as maxid, -> p.post_time, -> p.forum_id, -> t.post_id -> From -> phpbb_posts p, -> phpbb_posts_text t -> Where p.post_id = t.post_id -> Group by p.forum_id; +-------+------------+----------+---------+ | maxid | post_time | forum_id | post_id | +-------+------------+----------+---------+ | 1002 | 1123572136 | 1 | 863 | | 1000 | 1121588756 | 2 | 765 | | 990 | 1115923119 | 3 | 688 | | 1008 | 1121586504 | 4 | 763 | | 106 | 1034080826 | 5 | 71 | | 342 | 1069826479 | 6 | 342 | | 1001 | 1087113924 | 7 | 412 | | 974 | 1116425253 | 8 | 695 | +-------+------------+----------+---------+ 8 rows in set (0.01 sec)
sprawdziłem dla forum nr 6 i wszystko się zgadza : mysql> select p.post_id, t.post_id from phpbb_posts p,phpbb_posts_text t where p.forum_id=6 and p.post_id=t.post_id; +---------+---------+ | post_id | post_id | +---------+---------+ | 342 | 342 | | 338 | 338 | | 334 | 334 | .... | 302 | 302 | | 292 | 292 | | 289 | 289 | | 288 | 288 | | 287 | 287 | +---------+---------+ 22 rows in set (0.00 sec)
natomiast to samo dla forum nr 4 :
+---------+---------+ | post_id | post_id | +---------+---------+ | 763 | 763 | | 764 | 764 | | 952 | 952 | | 954 | 954 | .... | 1003 | 1003 | | 1008 | 1008 | | 1006 | 1006 | | 1007 | 1007 | +---------+---------+ 88 rows in set (0.00 sec) zapytanie nie pokazuje maksymalnego 1008 a forum pierwsze w kolejce rekordów 763, co jest grane ?. Mój problem polega na pytaniu ogólnym czy można połączyć tabele ze względu na pole grupowania funkcji Max ?.
Andrzej Kmicic - 29-12-2005 14:58
Prawdopodobnie (brak podpowiedzi) nie można jednym zapytaniem łączyć tabel z jednoczesnym grupowaniem. Poradziłem sobie poprzez PHP tak że najpierw grupuję post_id a w iterujcej po wyniku zapytania a w pętli wewnętrznej wybieram połączone na podstawie zgrupowanych post_id inne dane z pozostałych tabel.
pozdrowienia i zyczę szczęśliwego nowego roku
-- Andrzej Kmicic
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 29-12-2005 14:58
Andrzej Kmicic wrote: > Prawdopodobnie (brak podpowiedzi) nie można jednym zapytaniem łączyć tabel z > jednoczesnym grupowaniem.
Ano nie można. Chyba, że się ma podzapytania.
-- P.M.
Andrzej Kmicic - 29-12-2005 14:59
Użytkownik "Paweł Matejski" <madej@spam.madej.pl.eu.org> napisał w wiadomości news:doufn1$jhi$1@inews.gazeta.pl... > Andrzej Kmicic wrote: >> Prawdopodobnie (brak podpowiedzi) nie można jednym zapytaniem łączyć tabel z >> jednoczesnym grupowaniem. > > Ano nie można. Chyba, że się ma podzapytania. >
Ano tak przypuszczałem, dzięki. Z podzapytaniem próbowałem ale pewnie MySQL 3 cos tam zdaje się ich nie ma ponieważ sie czepia do podzapytań :). Więc zdecydowałem że zrobi to PHP na raty :)...
jakby ktoś,gdzieś, kiedyś chciał pobrac ostatnie posty z forum phpBB to fragment tego kodu to załatwi :
<code>
$sql="SELECT MAX( post_id ) AS maxid FROM phpbb_posts GROUP BY forum_id ORDER BY maxid DESC"; $result=sql($sql); // wykonanie zapytania while ($row = mysql_fetch_array($result, MYSQL_NUM)) { $pid =$row[0]; $sql=" SELECT FROM_UNIXTIME( p.post_time ) AS fdate, f.forum_name AS fname, s.topic_title as ftopic, u.username as fuser, t.post_text as ftext FROM phpbb_posts p, phpbb_users u, phpbb_forums f, phpbb_topics s, phpbb_posts_text t WHERE p.post_id = t.post_id AND p.post_id = $pid AND p.topic_id = s.topic_id AND p.poster_id = u.user_id AND p.forum_id = f.forum_id AND f.auth_view =0; ";
$resulta=sql($sql); // wykonanie zapytania
if ($resulta and (mysql_num_rows($resulta)>0)) { $rowa=mysql_fetch_row($resulta); //$rowa[0] - data, czas postu //$rowa[1] - nazwa forum //$rowa[2] - tytuł wątku //$rowa[3] - uzytkownik, nadawca postu //$rowa[4] - tekst postu (uwaga niezdekodowany BBCod) } }
</code> -- Andrzej Kmicic
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 29-12-2005 14:59
Andrzej Kmicic wrote: > Użytkownik "Paweł Matejski" <madej@spam.madej.pl.eu.org> napisał w wiadomości > news:doufn1$jhi$1@inews.gazeta.pl... > >>Andrzej Kmicic wrote: >> >>>Prawdopodobnie (brak podpowiedzi) nie można jednym zapytaniem łączyć tabel z >>>jednoczesnym grupowaniem. >> >>Ano nie można. Chyba, że się ma podzapytania. >> > > > Ano tak przypuszczałem, dzięki. Z podzapytaniem próbowałem ale pewnie MySQL 3 > cos tam zdaje się ich nie ma ponieważ sie czepia do podzapytań :). Więc > zdecydowałem że zrobi to PHP na raty :)... > > jakby ktoś,gdzieś, kiedyś chciał pobrac ostatnie posty z forum phpBB to fragment > tego kodu to załatwi :
Skoro już sie pochwaliłeś wersją to moge Ci zdradzić, że najwydajniejsza metoda, to z tablicą tymczasową. Swoim pierwszym zapytaniem zapełniasz tablice tmp, a w drugim robisz join z nią. Jeśli masz dużo for (-ów?) to ta wersja będzie wydajniejsza.
-- P.M.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
MySQL - jak =?ISO-8859-2?Q?wyeksportowa=E6_zawarto=B6=E6_wie?==?ISO-8859-2?Q?lkiej_tabeli?=
zanotowane.pldoc.pisz.plpdf.pisz.plkfia-tek.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|