Witam.

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:
  1. --
  2. -- Struktura tabeli dla `php_odwiedziny`
  3. --
  4.  
  5. CREATE TABLE `php_odwiedziny` (
  6. `id` int(11) NOT NULL AUTO_INCREMENT,
  7. `user_id` int(11) NOT NULL,
  8. `topic_id` int(11) NOT NULL,
  9. `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  10. PRIMARY KEY (`id`),
  11. KEY `user_id` (`user_id`)
  12. ) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=8 ;
  13.  
  14. --
  15. -- Zrzut danych tabeli `php_odwiedziny`
  16. --
  17.  
  18. INSERT INTO `php_odwiedziny` VALUES (1, 1, 1, '2011-05-01 11:00:00');
  19. INSERT INTO `php_odwiedziny` VALUES (2, 1, 1, '2011-05-02 11:00:00');
  20. INSERT INTO `php_odwiedziny` VALUES (3, 1, 1, '2011-05-03 11:00:00');
  21. INSERT INTO `php_odwiedziny` VALUES (4, 2, 1, '2011-05-03 11:42:57');
  22. INSERT INTO `php_odwiedziny` VALUES (5, 1, 2, '2011-05-02 11:00:00');
  23. INSERT INTO `php_odwiedziny` VALUES (6, 2, 2, '2011-05-04 11:00:00');
  24. INSERT INTO `php_odwiedziny` VALUES (7, 1, 1, '2011-05-25 12:00:00');
  25.  
  26. -- --------------------------------------------------------
  27.  
  28. --
  29. -- Struktura tabeli dla `php_wiadomosci`
  30. --
  31.  
  32. CREATE TABLE `php_wiadomosci` (
  33. `id` int(11) NOT NULL AUTO_INCREMENT,
  34. `topic_id` int(11) NOT NULL,
  35. `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  36. PRIMARY KEY (`id`)
  37. ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=5 ;
  38.  
  39. --
  40. -- Zrzut danych tabeli `php_wiadomosci`
  41. --
  42.  
  43. INSERT INTO `php_wiadomosci` VALUES (1, 1, '2011-05-02 10:00:00');
  44. INSERT INTO `php_wiadomosci` VALUES (2, 1, '2011-05-03 15:00:00');
  45. INSERT INTO `php_wiadomosci` VALUES (3, 2, '2011-05-02 11:00:00');
  46. 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):
  1. <pre><?php
  2. $link = mysql_connect('**', '***', '***');
  3. if (!$link) {
  4. die('Could not connect: ' . mysql_error());
  5. }
  6. if (!mysql_select_db('***')) {
  7. die('Could not select database: ' . mysql_error());
  8. }
  9. for($user_id=1;$user_id<=2;$user_id++){
  10. echo "Sprawdzamy użytkownika o id: $user_id
  11. ";
  12. $result = mysql_query("SELECT * FROM php_wiadomosci GROUP by topic_id ORDER by time");
  13. while ($row = mysql_fetch_array($result)) {
  14. $topic_id=$row['topic_id'];
  15. $result2 = mysql_query("SELECT * FROM php_odwiedziny WHERE topic_id=$topic_id AND user_id=$user_id ORDER by time DESC LIMIT 1");
  16. while ($row2 = mysql_fetch_array($result2)) {
  17. $t1=$row['time'];
  18. $t2=$row2['time'];
  19. if($t2>$t1){
  20. echo "Widział topic".$row['topic_id'];
  21. }else{
  22. echo "Nie widział.";
  23.  
  24. };
  25. echo "
  26. czas publikacji ($t1) < czas odwiedzin($t2)
  27. ";
  28. };
  29. }
  30. };
  31. mysql_close($link);
  32. ?></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?