Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> wydajność zapytania
acztery
post 30.09.2008, 15:16:03
Post #1





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

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


witam mam takie zapytanie:

  1. SELECT * ,
  2. (SELECT count(*) FROM stat WHERE stat.D='1' AND DocId=www.Id ) AS a1,
  3. (SELECT count(*) FROM stat WHERE stat.D='2' AND DocId=www.Id ) AS a2,
  4. (SELECT count(*) FROM stat WHERE stat.D='3' AND DocId=www.Id ) AS a3,
  5. (SELECT count(*) FROM stat WHERE stat.D='4' AND DocId=www.Id ) AS a4,
  6. (SELECT count(*) FROM stat WHERE stat.D='5' AND DocId=www.Id ) AS a5,
  7. (SELECT count(*) FROM stat WHERE stat.D='6' AND DocId=www.Id ) AS a6,
  8. (SELECT count(*) FROM stat WHERE stat.D='7' AND DocId=www.Id ) AS a7,
  9. (SELECT count(*) FROM stat WHERE stat.D='8' AND DocId=www.Id ) AS a8,
  10. (SELECT count(*) FROM stat WHERE stat.D='9' AND DocId=www.Id ) AS a9,
  11. (SELECT count(*) FROM stat WHERE stat.D='10' AND DocId=www.Id ) AS a10,
  12. (SELECT count(*) FROM stat WHERE stat.D='11' AND DocId=www.Id ) AS a11,
  13. (SELECT count(*) FROM stat WHERE stat.D='12' AND DocId=www.Id ) AS a12,
  14. (SELECT count(*) FROM stat WHERE stat.D='13' AND DocId=www.Id ) AS a13,
  15. (SELECT count(*) FROM stat WHERE stat.D='14' AND DocId=www.Id ) AS a14,
  16. (SELECT count(*) FROM stat WHERE stat.D='15' AND DocId=www.Id ) AS a15,
  17. (SELECT count(*) FROM stat WHERE stat.D='16' AND DocId=www.Id ) AS a16,
  18. (SELECT count(*) FROM stat WHERE stat.D='17' AND DocId=www.Id ) AS a17,
  19. (SELECT count(*) FROM stat WHERE stat.D='18' AND DocId=www.Id ) AS a18,
  20. (SELECT count(*) FROM stat WHERE stat.D='19' AND DocId=www.Id ) AS a19,
  21. (SELECT count(*) FROM stat WHERE stat.D='20' AND DocId=www.Id ) AS a20,
  22. (SELECT count(*) FROM stat WHERE stat.D='21' AND DocId=www.Id ) AS a21,
  23. (SELECT count(*) FROM stat WHERE stat.D='22' AND DocId=www.Id ) AS a22,
  24. (SELECT count(*) FROM stat WHERE stat.D='23' AND DocId=www.Id ) AS a23,
  25. (SELECT count(*) FROM stat WHERE stat.D='24' AND DocId=www.Id ) AS a24,
  26. (SELECT count(*) FROM stat WHERE stat.D='25' AND DocId=www.Id ) AS a25,
  27. (SELECT count(*) FROM stat WHERE stat.D='26' AND DocId=www.Id ) AS a26,
  28. (SELECT count(*) FROM stat WHERE stat.D='27' AND DocId=www.Id ) AS a27,
  29. (SELECT count(*) FROM stat WHERE stat.D='28' AND DocId=www.Id ) AS a28,
  30. (SELECT count(*) FROM stat WHERE stat.D='29' AND DocId=www.Id ) AS a29,
  31. (SELECT count(*) FROM stat WHERE stat.D='30' AND DocId=www.Id ) AS a30,
  32. (SELECT count(*) FROM stat WHERE stat.D='31' AND DocId=www.Id ) AS a31
  33.  
  34. FROM www GROUP BY www.Id


Ale przy np 40 tys rekordów w bazu stat mam komunikat o braku pamięci. Jak wywołam zapytanie bezpośrednio w phpmyadminie jest. może ktoś ma jakiś pomysł. Indexy są
Go to the top of the page
+Quote Post
melkorm
post 30.09.2008, 15:28:19
Post #2





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


eh pokaż z jakich tabel (najlepie ich struktury) co chcesz uzyskać ;] (najlepiej na przykładzie)

Ten post edytował melkorm 30.09.2008, 15:28:34


--------------------
Go to the top of the page
+Quote Post
acztery
post 30.09.2008, 15:31:07
Post #3





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

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


mam 2 tabele

1 to www gdzie są strony www
2 to stat gdzie sa statystyki

pole D to dzień miesiąca

i teraz chce wyswetlic liste wszystkich stron i policzyc ile bylo odwiedzin dla kazdej strony ( a1,a2, i tak analogicznie )

struktura

Kod
CREATE TABLE `stat` (
  `Id` int(10) NOT NULL auto_increment,
  `DocId` int(10) NOT NULL,
  `Act` enum('N','Y') collate utf8_unicode_ci NOT NULL,
  `UserId` int(6) NOT NULL,
  `Typ` enum('A','S') collate utf8_unicode_ci NOT NULL,
  `Ip` varchar(30) collate utf8_unicode_ci NOT NULL,
  `Red` varchar(200) collate utf8_unicode_ci NOT NULL,
  `Date` varchar(200) collate utf8_unicode_ci NOT NULL,
  `Time` int(15) NOT NULL,
  `M` int(2) NOT NULL,
  `W` int(2) NOT NULL,
  `D` int(2) NOT NULL,
  PRIMARY KEY  (`Id`),
  KEY `D` (`D`),
  KEY `Typ` (`Typ`),
  KEY `DocId` (`DocId`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=13002;

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

--
-- Struktura tabeli dla  `www`
--

CREATE TABLE `www` (
  `Id` int(10) NOT NULL auto_increment,
  `CatId` int(10) NOT NULL,
  `UserId` int(10) NOT NULL,
  `Date` varchar(180) NOT NULL,
  `Act` enum('N','Y') NOT NULL,
  `Adult` enum('N','Y') NOT NULL,
  `Title` varchar(250) character set utf8 collate utf8_polish_ci NOT NULL,
  `Desc` text character set utf8 collate utf8_polish_ci NOT NULL,
  `http` varchar(250) character set ucs2 collate ucs2_polish_ci NOT NULL,
  `Typ` enum('W','Z','N') NOT NULL,
  `Img1` varchar(200) NOT NULL,
  PRIMARY KEY  (`Id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34;


Ten post edytował acztery 30.09.2008, 15:32:30
Go to the top of the page
+Quote Post
phpion
post 1.10.2008, 20:23:45
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




To co pokazałeś w pierwszym poście to jakiś koszmar! Nie sądziłem, że ktoś jest w stanie trzaskać (wymyśleć!) takie zapytanie... Ja bym Ci sugerował inne podejście do sprawy oraz zapoznanie się z tematyką:
- grupowanie (GROUP BY),
- podzapytania skorelowane.
Wykorzystując grupowanie jesteś w stanie bez problemu otrzymać statystyki, o które Ci chodzi. Jest tu jednak jeden problem: jeżeli w tabeli 'stat' nie będzie żadnych odwiedzin dla któregoś dokumentu to nie zostanie on uwzględniony w zbiorze wynikowym.
Wykorzystując podzapytanie skorelowane ominiesz powyższą niedogodność ale samo zapytanie może być mniej wydajne (szczególnie przy większej ilości dokumentów).
Decyzja, którą drogą pójdziesz należy do Ciebie.
Go to the top of the page
+Quote Post
ddiceman
post 3.10.2008, 12:11:49
Post #5





Grupa: Zarejestrowani
Postów: 326
Pomógł: 121
Dołączył: 23.07.2008
Skąd: Wrocław

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


Jezeli chcesz uzyskac taki format, jaki miales, to proponuje

  1. SELECT *,
  2. SUM(IF(stat.D = '1', 1, 0)) AS a1,
  3. SUM(IF(stat.D = '2', 1, 0)) AS a2,
  4. SUM(IF(stat.D = '3', 1, 0)) AS a3,
  5. ...
  6. SUM(IF(stat.D = '31', 1, 0)) AS a31
  7. FROM www LEFT JOIN stat ON (www.Id = stat.DocId)
  8. GROUP BY www.Id;


Jezeli mozesz troche zmienic

  1. SELECT *, COUNT(stat.DocId) FROM www LEFT JOIN stat ON (www.Id = stat.DocId) GROUP BY www.Id, stat.DocId;


Ale pisze z palca, wiec musisz sam przetestowac sobie to.
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.06.2025 - 17:13