Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Najnowsza umowa użytkowników
Petre
post 23.06.2012, 17:56:33
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 12.05.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
mmmmmmm
post 23.06.2012, 19:11:10
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


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...

Ten post edytował mmmmmmm 23.06.2012, 19:13:49
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 22:54