Mam problem z stworzeniem odpowiedniego zapytania.
Moja baza danych to:
tablica 1 - odwiedziny
-id
-kto
-kiedy_odwiedził (timestamp)
Przykładowe dane:
1 -- 1 --przedwczoraj
2 -- 1 -- wczoraj
3 -- 1 -- dzis o 15
4 -- 2 -- dzis o 16
5 -- 2 -- dzis o 14
6 -- 2 -- 3 sekundy temu
tablica 2 - wiadomosci
-id
-topic_id
-kiedy (timestamp)
Przykładowe dane:
1 -- 1 -- dzis o 1
2 -- 1 -- dzis o 2
3 -- 1 -- dzis o 3
4 -- 2 -- wczoraj o 2
5 -- 2 -- dzis o 2
Chciałbym, aby użytkownikowi wyświetlała się informacja czy od ostatniej wiadomości widział dany wątek. Nie wiem jak bez podzapytania pobrać tylko jeden rekord i go porównywać.
Jedynym moim pomysłem jest pobranie listy tematów, a następnie pobranie dla każdego tematu indywidualnie ostatniej odwiedziny, lecz przy większej ilości wątków sądzę, że jest to rozwiązanie niezbyt wydajne i optymalne.
Nie udało mi się odszukać odpowiednich informacji samodzielnie, stąd zwracam się do Was o pomoc.
Zapytania tworzące przykładową bazę danych:
-- -- Struktura tabeli dla `php_odwiedziny` -- CREATE TABLE `php_odwiedziny` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `topic_id` int(11) NOT NULL, `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `user_id` (`user_id`) ) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=8 ; -- -- Zrzut danych tabeli `php_odwiedziny` -- INSERT INTO `php_odwiedziny` VALUES (1, 1, 1, '2011-05-01 11:00:00'); INSERT INTO `php_odwiedziny` VALUES (2, 1, 1, '2011-05-02 11:00:00'); INSERT INTO `php_odwiedziny` VALUES (3, 1, 1, '2011-05-03 11:00:00'); INSERT INTO `php_odwiedziny` VALUES (4, 2, 1, '2011-05-03 11:42:57'); INSERT INTO `php_odwiedziny` VALUES (5, 1, 2, '2011-05-02 11:00:00'); INSERT INTO `php_odwiedziny` VALUES (6, 2, 2, '2011-05-04 11:00:00'); INSERT INTO `php_odwiedziny` VALUES (7, 1, 1, '2011-05-25 12:00:00'); -- -------------------------------------------------------- -- -- Struktura tabeli dla `php_wiadomosci` -- CREATE TABLE `php_wiadomosci` ( `id` int(11) NOT NULL AUTO_INCREMENT, `topic_id` int(11) NOT NULL, `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=5 ; -- -- Zrzut danych tabeli `php_wiadomosci` -- INSERT INTO `php_wiadomosci` VALUES (1, 1, '2011-05-02 10:00:00'); INSERT INTO `php_wiadomosci` VALUES (2, 1, '2011-05-03 15:00:00'); INSERT INTO `php_wiadomosci` VALUES (3, 2, '2011-05-02 11:00:00'); INSERT INTO `php_wiadomosci` VALUES (4, 1, '2011-05-03 11:44:18');
Moje rozwiązanie(pisane specjalnie,a oryginalne pisane m.in.z wykorzystaniem PDO):
<pre><?php if (!$link) { } } for($user_id=1;$user_id<=2;$user_id++){ echo "Sprawdzamy użytkownika o id: $user_id "; $topic_id=$row['topic_id']; $result2 = mysql_query("SELECT * FROM php_odwiedziny WHERE topic_id=$topic_id AND user_id=$user_id ORDER by time DESC LIMIT 1"); $t1=$row['time']; $t2=$row2['time']; if($t2>$t1){ }else{ }; echo " czas publikacji ($t1) < czas odwiedzin($t2) "; }; } }; ?></pre>
Gdy będzie wiadomosci(unikalnych topic_id w php_wiadomosci)dużo generowanych będzie zapytań n+1 zaptań, gdzie n to liczba wiadomości. Wolałbym tego uniknąć zważywszy, że ilość odwiedzin oraz wiadomosci jest trudna do przewidzenia. A może moja chęć minimalizacji liczby zapytań jest niesłuszna?