Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z MAX()
Forum PHP.pl > Forum > Bazy danych
lolo
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...
FiDO
[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...
lolo
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]
FiDO
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]
lolo
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.
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.