Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Najnowsza umowa użytkowników
Forum PHP.pl > Forum > Bazy danych > MySQL
Petre
Witajcie,
przejdę od razu do rzeczy:

struktura tabel wygląda następująco:

  1. CREATE TABLE IF NOT EXISTS `documentcontents` (
  2. `docid` int(11) NOT NULL DEFAULT '0',
  3. `title` text NOT NULL,
  4. `fromdate` int(11) NOT NULL DEFAULT '0',
  5. `todate` int(11) NOT NULL DEFAULT '0',
  6. `filename` varchar(255) NOT NULL DEFAULT '',
  7. `contenttype` varchar(255) NOT NULL DEFAULT '',
  8. `md5sum` varchar(32) NOT NULL DEFAULT '',
  9. `description` text NOT NULL,
  10. UNIQUE KEY `docid` (`docid`),
  11. KEY `md5sum` (`md5sum`),
  12. KEY `fromdate` (`fromdate`),
  13. KEY `todate` (`todate`)
  14. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  15.  
  16. CREATE TABLE IF NOT EXISTS `docreply` (
  17. `id` int(11) NOT NULL AUTO_INCREMENT,
  18. `customerid` int(11) NOT NULL,
  19. `docid` int(11) NOT NULL,
  20. `type` varchar(255) NOT NULL,
  21. `value` tinyint(1) NOT NULL,
  22. `node` varchar(255) NOT NULL,
  23. PRIMARY KEY (`id`),
  24. KEY `docid` (`docid`),
  25. KEY `type` (`type`)
  26. ) ENGINE=InnoDB DEFAULT CHARSET=latin2 ;
  27.  
  28. CREATE TABLE IF NOT EXISTS `documents` (
  29. `id` int(11) NOT NULL AUTO_INCREMENT,
  30. `type` tinyint(4) NOT NULL DEFAULT '0',
  31. `number` int(11) NOT NULL DEFAULT '0',
  32. `numberplanid` int(11) NOT NULL DEFAULT '0',
  33. `cdate` int(11) NOT NULL DEFAULT '0',
  34. `customerid` int(11) NOT NULL DEFAULT '0',
  35. `userid` int(11) NOT NULL DEFAULT '0',
  36. `name` varchar(255) NOT NULL DEFAULT '',
  37. `address` varchar(255) NOT NULL DEFAULT '',
  38. `zip` varchar(10) NOT NULL DEFAULT '',
  39. `city` varchar(32) NOT NULL DEFAULT '',
  40. `ten` varchar(16) NOT NULL DEFAULT '',
  41. `ssn` varchar(11) NOT NULL DEFAULT '',
  42. `paytime` tinyint(4) NOT NULL DEFAULT '0',
  43. `paytype` varchar(255) NOT NULL DEFAULT '',
  44. `closed` tinyint(1) NOT NULL DEFAULT '0',
  45. `reference` int(11) NOT NULL DEFAULT '0',
  46. `extnumber` varchar(255) NOT NULL DEFAULT '',
  47. `reason` varchar(255) NOT NULL DEFAULT '',
  48. `cashvalue` float(6,2) NOT NULL DEFAULT '0.00',
  49. PRIMARY KEY (`id`),
  50. KEY `cdate` (`cdate`),
  51. KEY `numberplanid` (`numberplanid`)
  52. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 ;


Co chcę osiągnąć:

Chcę uzyskać listę osób (tj. adres, name, fromdate, todate) z ich ostatnią wiążącą umową .

Użyłem takiego zapytania:

  1. SELECT d.name, d.address, d.id, d.customerid, dc.docid, dc.fromdate FROM `documents` d INNER JOIN documentcontents dc ON (d.id=dc.docid) WHERE d.id=(SELECT MAX(d.id) FROM documents WHERE customerid=d.customerid) AND dc.fromdate<>0 ORDER BY name ASC , fromdate DESC



Niestety nie wyrzuca wyników, a raczej wklepując go przez phpmyadmin kręci się i kręci i kręci... Czy ja popełniłem gdzieś błąd ?

Zaznaczam , że to nie ja projektowałem bazę ; )

Z góry dzięki za pomoc
mmmmmmm
Wydaje mi się (a raczej dobrze mi się wydaje), że w podselekcie zrobiłeś błąd. Powinno być `id`, zamiast d.`id`, czyli:
  1. SELECT d.name, d.address, d.id, d.customerid, dc.docid, dc.fromdate FROM `documents` d INNER JOIN documentcontents dc ON (d.id=dc.docid) WHERE d.id=(SELECT MAX(id) FROM documents WHERE customerid=d.customerid) AND dc.fromdate<>0 ORDER BY name ASC , fromdate DESC

I jeszcze sobie sprawdź, czy to nie będzie czasem szybsze:
  1. SELECT d.name, d.address, d.id, d.customerid, dc.docid, dc.fromdate FROM `documents` d INNER JOIN documentcontents dc ON (d.id=dc.docid) WHERE d.id=(SELECT id FROM documents WHERE customerid=d.customerid ORDER BY id DESC LIMIT 1) AND dc.fromdate<>0 ORDER BY name ASC , fromdate DESC

Sprawdź oczywiście EXPLAIN-em smile.gif

Aha, no i sortowanie masz skopane... Po co sortujesz wg wartości stałej? ORDER BY `name` ASC questionmark.gif z tabeli `documents` powinieneś mieć tylko 1 rekord (bo WHERE ci to zapewnia), więc będziesz miał tylko jedno `name`... Niepotzrebny narzut...
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.