Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: group by?
Forum PHP.pl > Forum > Bazy danych > MySQL
kicaj
Moja tabela
Kod
id - opis - nid

----------------

1 - qaz  - 1

2 - wsx  - 2

3 - edc  - 1

4 - rfv  - 3

5 - tgb  - 1

6 - yhn  - 5


Chcem wyswietlic tak zeby nie powtarzaly sie rekordy o takim samym 'nid' i posortowac wg pola 'data' (typ datetime).
W tym przypadku powinno wyswietlic 4 rekordy, od najnowszego do najstarszego.
Jak skonstruowac takie zapytanie MySQL?
spenalzo
[sql:1:2e1581bf9f]SELECT DISTINCT nid, id, opis FROM tabela ORDER BY data[/sql:1:2e1581bf9f]
kicaj
Hmm ja mam cos takiego
[sql:1:f2e92eec8e]SELECT * FROM tabela GROUP BY nid ORDER BY data DESC
[/sql:1:f2e92eec8e] dobrze bo chyba mi grupuje, tzn wyswietla tylko tyle wiersz ile jest roznych 'nid' - czyli dobrze, ale wyswietla pierwsze dodane, a nie jak chcialem wedlug najnowszych
kicaj
...dobra! wszystko do nowa!

Moja baza z danymi
[sql:1:1a76a3b02b]CREATE TABLE `mcz_post` (
`id` int(11) NOT NULL auto_increment,
`temat` varchar(75) NOT NULL default '',
`post` text NOT NULL,
`data` datetime default NULL,
`id_forum` int(11) NOT NULL default '0',
`id_temat` int(11) NOT NULL default '0',
`id_nick` int(11) NOT NULL default '0',
`nick` varchar(10) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) TYPE=MyISAM

INSERT INTO `mcz_post` VALUES (1, 'Pierwszy temat', 0x636f732074616d, '2003-11-25 20:40:43', 4, 1, 1, 'kicaj_');
INSERT INTO `mcz_post` VALUES (2, 'Drugi temat', 0x776574647366, '2003-11-25 20:41:59', 4, 2, 1, 'kicaj_');
INSERT INTO `mcz_post` VALUES (3, 'Trzeci temat', 0x737367666773646667, '2003-11-25 20:42:53', 4, 3, 1, 'kicaj_');
INSERT INTO `mcz_post` VALUES (4, 'Odpowiedz nr 1 do Pierwszy temat', '', '2003-11-25 20:44:17', 4, 1, 1, 'kicaj_');
INSERT INTO `mcz_post` VALUES (5, 'Odpowiedz nr 2 do Drugi Temat', '', '2003-11-25 20:50:45', 4, 2, 1, 'kicaj_');
INSERT INTO `mcz_post` VALUES (6, 'Odpowiedz nr 3 dla Trzeci temat', '', '2003-11-25 20:52:26', 4, 3, 1, 'kicaj_');
INSERT INTO `mcz_post` VALUES (7, 'Odpowiedz nr 4 do Pierwszy temat', 0x646a6b6c736a64666b, '2003-11-25 20:53:25', 4, 1, 1, 'kicaj_');
INSERT INTO `mcz_post` VALUES (8, 'Czwarty temat', 0x66736466, '2003-11-25 21:54:14', 4, 8, 1, 'kicaj_');
INSERT INTO `mcz_post` VALUES (9, 'Odpowiedz nr 5 do Trzeci temat', '', '2003-11-27 14:42:34', 4, 3, 1, 'kicaj_');[/sql:1:1a76a3b02b]

Jesli 'id' jest rowne z 'id_temat' to jest to pierwszy post (temat), jezeli 'id' nie jest rowne z 'id_temat' to jest to post (odpowiedz) do tematu rownemu 'id_temat' smile.gif

I chcem miec taki efekt:

Kod
2003-11-27 14:42:34 | Odpowiedz nr 5 do Trzeci temat

2003-11-25 21:54:14 | Czwarty temat

2003-11-25 20:53:25 | Odpowiedz nr 4 do Pierwszy temat

2003-11-25 20:52:26 | Odpowiedz nr 3 dla Trzeci temat


Jasniej nie potrafie, przyklad jest na tym forum! Lista tematow najswiezszy u gory, zboku data ostatniej odpowiedzi!
kicaj
hehe to moze inaczej?

Mam tematy i odpowiedzi trzymane w jednej tabeli, tematy odrozniaja sie tym ze w kolumnie 'rodzaj' ma wartos '1' a odpowiedzi '0'.
Jak je posortowac wg daty (pole datetime), tak zeby obok tematu widniala data ostatniej odpowiedzi (i najnowszy na gorze)!

questionmark.gif
adwol
[sql:1:b32028ef3a]select id_temat, max(data) as data from mcz_post group by id_temat order by data desc[/sql:1:b32028ef3a]
O takie coś Ci chodziło?
kicaj
Zapytanie jest dobre! thx, ale teraz musze zrobic tak zeby obok najnowszego tematu byla ostatnia data[php:1:9c376cbcf5]<?php
$zapytanie = "SELECT *, max(data) AS data2 FROM mcz_post GROUP BY id_temat ORDER BY data2 DESC";
$wykonaj = mysql_query($zapytanie);

while($wiersz = mysql_fetch_array($wykonaj)) {

echo "$wiersz[data] - $wiersz[temat] ";

$zapytanie1 = "SELECT * FROM mcz_post WHERE id_temat=$wiersz[id] AND (id!=id_temat) ORDER BY data DESC";
$wykonaj1 = mysql_query($zapytanie1);
$licz1 = mysql_num_rows($wykonaj1);

echo "<br>";

while($wiersz1 = mysql_fetch_array($wykonaj1)) {
echo "+ $wiersz1[data] $wiersz1[temat]<br>";

}

echo "<br>";

}
?>[/php:1:9c376cbcf5]

Wynik:
Kod
2003-11-25 20:42:53 - Trzeci temat

+ 2003-11-27 14:42:34 Odpowiedz nr 5 do Trzeci temat

+ 2003-11-25 20:52:26 Odpowiedz nr 3 dla Trzeci temat



2003-11-25 21:54:14 - Czwarty temat



2003-11-25 20:40:43 - Pierwszy temat

+ 2003-11-25 20:53:25 Odpowiedz nr 4 do Pierwszy temat

+ 2003-11-25 20:44:17 Odpowiedz nr 1 do Pierwszy temat



2003-11-25 20:41:59 - Drugi temat

+ 2003-11-25 20:50:45 Odpowiedz nr 2 do Drugi Temat


Chce tylko zeby obok tematu byla data ostatniego posta!
kicaj
OK! dziala juz bezproblemowo tongue.gif

Ale teraz dodalem kolumne w 'ogloszenia' i gdy ma ona wartosc '1' to przy temacie pojawia sie napis 'ogloszenie'.
Chcialbym zeby te ogloszenia zawsze byly na gorze, a reszte sortowalo wg daty

Jak to zrobic?
FiDO
[sql:1:896c245e75]...
ORDER BY ogloszenia DESC, data
[/sql:1:896c245e75]
kicaj
Cytat
Moja tabela
Kod
id - opis - nid

----------------

1 - qaz  - 1

2 - wsx  - 2

3 - edc  - 1

4 - rfv  - 3

5 - tgb  - 1

6 - yhn  - 5


niestety moja tabela teraz wyglada troszke inaczej:
Kod
id - opis - nid

----------------

1 - qaz  - 0 //temat

2 - wsx  - 0 //temat

3 - edc  - 1 //post

4 - rfv  - 3 //post

5 - tgb  - 1

6 - yhn  - 5

gdyz podczas wstawiania do bazy tematow nie moge ustalic jaki obecny temat bedzie mial 'nid'

Jak zrobic teraz to zapytanie??
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.