Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> zliczanie i sumowanie
acztery
post
Post #1





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

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


mam kłopot z relacją. Mysql dziwnie sie zachowuje mimo tego, że oczekuje czego innego.

mam takie zapytanie:

  1. SELECT * , SUM( ifnull( documents.count, 0 ) ) AS CtrDocuments, count( ifnull( documents.Id, 0 ) ) AS CountDocuments, SUM( ifnull( count, 0 ) ) AS SumDocuments, cat.Title AS Title, cat.Id AS Id, cat.UserId AS UserId, cat.sort AS sort
  2. FROM `cat` LEFT JOIN `documents` ON `documents`.`Cat` = `cat`.`Id`
  3. LEFT JOIN `user` ON `user`.`user_id` = `cat`.`UserId`
  4. WHERE (
  5. cat.Lang = 'ddd'
  6. ) AND (
  7. documents.Lang = 'ddd'
  8. ) AND (
  9. cat.Parent = '0'
  10. )
  11. GROUP BY cat.Id
  12. ORDER BY cat.sort DESC LIMIT 0, 30


pobiera liste kategori i liczy ile w danej jest rekordów i sumuje kolumne count. Na chwile obecna działa tylko wtedy gdy jest jakis element w danej kategori ale jak nie ma zamiast pokaza 0 to go nie wyswetla mimo tego ze mam LEFT. RIGHT i INNER tak samo

Pod zapytania niewchodzą w gre. Kilka z was moze zdziwic ze 2 razy podaje jezyk dla roznych tabel ale inaczej nie działa :/
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mwojcik
post
Post #2





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.07.2007

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


Nie wiem, czy to ty czy ktoś napisał strukturę tej bazy, ale jest... zła. Przede wszystkim ktoś nie rozróżnia po co są typy danych i do czego służą.
Przykład pierwszy z brzegu :
Tabela ‘cat’
  1. `Id` varchar(255) collate utf8_polish_ci NOT NULL DEFAULT '',

Identyfikator zapisany w postaci stringa ? W dodatku 255 znakowego ? Do zapisu klucza głównego używa się integera i tworzy indeks – wtedy baza przeszukuje rekordy o wiele szybciej .
Tak samo jak w tabeli ‘documents’
  1. `Cat` varchar(255) collate utf8_polish_ci NOT NULL DEFAULT '',

z poprzednich postow wnioskuje ze jest to klucz obcy do tabeli ‘cat’ – też powinien być integerem.
Następna sprawa, chociażby w tabeli ‘cat’
  1. `Time` varchar(255) collate utf8_polish_ci NOT NULL DEFAULT '',

Po co ci tyle miejsca na date ? Żeby to dobrze działało przede wszystkim trzeba zmienic strukture tej bazy, bo w przeciwnym razie będą się pojawiac nieoczekiwane bledy, trudne do zdiagnozowania.
Co do języka
  1. `Lang` varchar(255) collate utf8_polish_ci NOT NULL DEFAULT '',

czy naprawdę potrzebujesz aż 255 znaków, zeby zapisać informacje o języku ? zmniejsz te pole np. do 2 czy 3 znaków i wpisuj tam informacje w postaci np.’pol’, ‘eng’. Wtedy zapytanie zwracające sumę oraz ilość dokumentów w języku polskim dla każdej kategorii głównej w języku polskim mogloby wygladac tak:

  1. SELECT cat.title, cat.id , SUM (IFNULL(documents.count, 0)) AS sum_documents, COUNT (IFNULL(documents.id, 0)) AS count_documents
  2. FROM cat LEFT OUTER JOIN documents ON cat.id = documents.cat
  3. WHERE cat.parent = 0 AND cat.lang = ‘pol’ AND documents.lang = ‘pol’ GROUP BY cat.id, cat.title


Generalnie – przepisz ta baze z uwzglednieniem zastosowania odpowiednich typow do przetrzymywanych danych.
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 8.10.2025 - 14:34