Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> problem z MAX()
lolo
post
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 30.03.2003
Skąd: Kraków

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


A wiec tak. Mam dwie tabaele:

forumTopics:
Kod
+---------+-------+--------------------------------------------+------------+-------------+------------+

| topicID | topic  | description                                     | postNumber | existsSince | restricted |

+---------+-------+--------------------------------------------+------------+-------------+------------+

|       1    | test    | bla bla bla tutaj jeszcze wiecej ajkis bla  |          0     | 2004-01-16  |          0 |

|       2    | Drugi  | Opis tematu drugiego                          |         10 | 2003-12-31  |          0 |

+---------+-------+--------------------------------------------+------------+-------------+------------+


i forumArticles:
Kod
+-----------+---------+----------+--------+------------+---------+---------+

| articleID | topicID | parentID | author | date       | topic   | article |

+-----------+---------+----------+--------+------------+---------+---------+

|         1 |       1 |        0 | lolo   | 2004-01-18 | cos tam | hallo?  |

|         2 |       1 |        0 | pucek  | 2004-01-18 | halo?   | halo?   |

|         3 |       1 |        0 | rr     | 2004-01-18 | ff      | ff      |

|         4 |       2 |        0 | tt     | 2004-01-01 | Watek 1 | 4343    |

|         5 |       2 |        0 | gg     | 2004-12-05 | Watek 2 | gg      |

|         6 |       2 |        0 | gg     | 0000-00-00 | d       | d       |

+-----------+---------+----------+--------+------------+---------+---------+


I teraz chcialbym dla kazdego topicID wyluskac z tej tabeli tego, kto dodal tam ostatniego posta. A wiec articleId, author, topic i date. Udaje mi sie niestety tylko articleID dla kazdeego topicID:

[sql:1:6aa4b6e30d]
SELECT topicID, MAX(articleID)
FROM forumArticles
GROUP BY topicID
[/sql:1:6aa4b6e30d]

Ale nie udaje mi sie juz do tego dopasowac odpowiedniego autora, daty i tematu posta. Wie ktos jak to zrobic? Moj serwer to 4.0.35, wiec nie dzialaja tam niektore sztuczki z SQL99....

Dzikei za pomoc...


--------------------
"Tylko dwie rzeczy sa nieskonczone: wszechswiat i glupota ludzka. Choc co do pierwszego nie mam pewnosci." [Albert Einstein, wybitny fizyk]
Go to the top of the page
+Quote Post
FiDO
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

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


[sql:1:ddabecda68]
SELECT topicID, MAX(articleID), author, date, topic
FROM forumArticles
GROUP BY topicID
[/sql:1:ddabecda68]
O takie cos chodzi?


Cytat
Moj serwer to 4.0.35 [...]

A skad go masz?? Z tego co widze z galezi 4.0.x najnowsza wersja jest 4.0.17...


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
lolo
post
Post #3





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 30.03.2003
Skąd: Kraków

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


Wykradlem z tajnych rosyjskich laboratoriow... biggrin.gif

A tak naprawde to za szybko zakmnalem shella i zobaczylem piatke na koncu i mi sie cos ubzduralo, a tak naprawde to 4.0.15a. Sorki. I tak to bez roznicy, bo bym musial miec 4.1.x...

A co do twojego rozwiazania, to niestety nie to, bo wykonujac to, dostaje:

Kod
+---------+----------------+--------+------------+---------+

| topicID | MAX(articleID) | author | date       | topic   |

+---------+----------------+--------+------------+---------+

|       1 |              3 | lolo   | 2004-01-18 | cos tam |

|       2 |              6 | tt     | 2004-01-01 | Watek 1 |

+---------+----------------+--------+------------+---------+


A to nie jest author, date, topic artykulu o ID 3 (vel 6). On po prostu w tym rozwiazaniu (gdzies kolo 2-giej tez juz na to wpadlem smile.gif) wybiera MAX(articleID) dla kazdego topicId a reszte to pierwszy rekord dla danego topicID.... a powinien byc OSTATNI.[/sql]


--------------------
"Tylko dwie rzeczy sa nieskonczone: wszechswiat i glupota ludzka. Choc co do pierwszego nie mam pewnosci." [Albert Einstein, wybitny fizyk]
Go to the top of the page
+Quote Post
FiDO
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

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


Ha.. no tak... pomylilem sie.. jednak bez subqueries w jednym zapytaniu sie tego nie da zrobic (no da sie.. pisza w manualu o takim jednym triku, ale pisza tez ze jest niewydajny), wiec podaj rozwiazanie w dluzszej wersji:
[sql:1:057d8654c4]create temporary table tmp (articleID int, maks int)[/sql:1:057d8654c4]
[sql:1:057d8654c4]LOCK TABLES art READ[/sql:1:057d8654c4]
[sql:1:057d8654c4]insert into tmp select articleID, MAX(articleID) from art group by topicID[/sql:1:057d8654c4]
[sql:1:057d8654c4]select topicID, autor, data, topic from art inner join tmp on (art.a
rticleID = maks)[/sql:1:057d8654c4]
[sql:1:057d8654c4]UNLOCK TABLES[/sql:1:057d8654c4]
[sql:1:057d8654c4]DROP TABLE tmp[/sql:1:057d8654c4]
Oczywiscie musisz wszystkie po kolei zapytania wykonac w jednym polaczeniu z baza. Ostatnie poleceniem ewentualnie mozesz pominac, bo serwer sam usunie tymczasowe tabele jak skonczy sie polaczenie.


Za pomoca subqueries (dostepne juz w mysql 4.1) to nie wiem dokladnie, bo nie mam na czym chwilowo sprawdzic,wiec bede strzelal:
[sql:1:057d8654c4]select topicID, autor, data, topic from art where articleID =
(SELECT MAX(articleID) FROM art GROUP BY topicID)[/sql:1:057d8654c4]


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
lolo
post
Post #5





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 30.03.2003
Skąd: Kraków

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


sad.gif Teraz tylko sie musze dowiedziec czy u klienta jest 4.1...

A inne pytanie: czy bardzije mi sie oplaca robic to w ten dlugi sposob (vel jako subqueries), czy lepiej zapisywac po prostu maxid, maxaurthor itd. w tabeli z topicami? I przy kazdej aktualizacji tabeli articles aktualizowac topics? Bo podobno jest mniej zapytan o zapisywanie na wiekszosci stron...

Dzieks za odpowiedz.


--------------------
"Tylko dwie rzeczy sa nieskonczone: wszechswiat i glupota ludzka. Choc co do pierwszego nie mam pewnosci." [Albert Einstein, wybitny fizyk]
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 Aktualny czas: 20.08.2025 - 00:26