ďťż
 
[MySQL] Zapytanie do phpBB pomocy ! ďťż
 
[MySQL] Zapytanie do phpBB pomocy !
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • kfia-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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com