Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak zliczyć coś takiego?
Forum PHP.pl > Forum > Bazy danych > MySQL
xamil
Dwa pytania. Pierwsze chyba proste ale i tak sobie nie radze. Jeżeli chodzi o sql bowiem to dopiero raczkuje. drugie nieco bardziej skomplikowane i aż się wstyd przyznać nie pisane przeze mnie... niestety osoba która mi to napisała nie jest mi obecnie w stanie teraz pomóc a potrzebuje szybkiej odpowiedzi.

1.
  1. SELECT branze.id, count(firmy.id) ilosc_firm
  2. FROM branze, firmy WHERE branze.id = firmy.id_branzy GROUP BY branze.id;


Zapytanie to ma mi wyciągnąć wszystkie branze (z tabeli branze) i liczbe firm (z tabeli firmy) o takiej samej branży. Wszystko idzie gładko ale do czasu... W przypadku gdy dana branża nie jest przypisana do żadnej firmy potrzebuje wyświelić wartość zero. Niestety zapytanie w obecnej postaci pomija takie branze bowiem nie spełniają warunku łączenia tabel branze.id = firmy.id_branzy.

2.
  1. SELECT firmy.id, kontakty.id_handlowca, branze.nazwa, kontakty.DATA data_spotkania, min( kontakty_all.DATA )
  2. FROM handlowcy, branze, kontakty
  3. LEFT JOIN firmy ON kontakty.id_firmy = firmy.id
  4. LEFT JOIN kontakty kontakty_all ON kontakty_all.id_firmy = firmy.id
  5. WHERE (
  6. kontakty.id_handlowca = '2' AND branze.id = firmy.id_branzy AND handlowcy.id = kontakty.id_handlowca AND firmy.nazwa LIKE '%'
  7. )
  8. GROUP BY firmy.id, kontakty.DATA ASC HAVING min( kontakty_all.DATA ) = data_spotkania
  9. ORDER BY firmy.nazwa



Potrzebuje zliczyć całkowitą ilośc rekordów takiego zapytania. Potrzebne jest mi to do wyświetlenia konkretnej liczby rekordów na stronie (np. 25) od zadanej pozycji. Tak abym w następnym zapytaniu mógł użyć np. LIMIT 25,25;

UWAGA!!! Zapytania nie mogą zawierać podzapytań.
DeyV
ad 1.
  1. SELECT
  2. branze.id,
  3. count(firmy.id) ilosc_firm
  4. FROM branze LEFT JOIN firmy ON ( branze.id = firmy.id_branzy )
  5. GROUP BY branze.id;


// używaj odpowiedniego bbcode
xamil
Właśnie do tego sam doszedłem;) Ale oczywiście wielkie dzięki!! Tak dokładniej to odpowiedzieć znalazłem na waszym forum;).... to forum to to czego szukałem od dawna... teraz pora na rozwiąznie tego drugiego. Próbuje to sam rozgryść wzbogacony o nową wiedze ale mi nie idzie:( ;) Później dojdzie jeszcze jedna kwestia ale ona może sama się rozwiąze.
DeyV
Cieszę się, że tak uważasz. smile.gif

Drugiego problemu nie jestem jednak wstanie pomóc Ci rozwiązać bez struktury i wycinka zawartości z bazy.
Umieść je tu (najlepiej w postaci linka do pliku SQL) a może uda się coś jeszcze wykombinować.
popbart
Drugi problem byłby błahy gdyby nieszczęsny mysql posiadał podzapytania.
Jest na to taka sztuczka:
Tworzysz tabele tymczasową, wykonujesz takie zapytanie (od wersji 4.0.1)
  1. INSERT
  2. INTO tabela_temp SELECT....//twój SELECT

następnie :
  1. SELECT count(*) AS ile
  2. FROM tabela_temp

i na koniec
  1. DROP TABLE tabela_temp
DeyV
  1. SELECT
  2. SUM( IF( MIN( kontakty_all.DATA ) = data_spotkania , 1, 0 ) ) ilosc
  3. FROM handlowcy, branze, kontakty
  4.  
  5. LEFT JOIN firmy ON kontakty.id_firmy = firmy.id
  6. LEFT JOIN kontakty kontakty_all ON kontakty_all.id_firmy = firmy.id
  7.  
  8. WHERE ( kontakty.id_handlowca='2' AND branze.id=firmy.id_branzy AND handlowcy.id=kontakty.id_handlowca AND firmy.nazwa LIKE '%' )
  9.  
  10. GROUP BY firmy.id, kontakty.DATA ASC


Chyba powinno zadziałać.
xamil
MySQL zwrócił komunikat:
#1111 - Invalid use of group function

Wszystko byłoby ok gdyby nie to że narzucenie SUM na MIN powoduje taki właśnie błąd.

Wywołanie takiego zapytania:

  1. SELECT count(firmy.id), firmy.id, handlowcy.id, kontakty.DATA data_spotkania, min( kontakty_all.DATA )
  2. FROM kontakty LEFT JOIN firmy ON kontakty.id_firmy = firmy.id LEFT JOIN kontakty kontakty_all ON kontakty_all.id_firmy = firmy.id LEFT JOIN handlowcy ON (handlowcy.id=kontakty.id_handlowca) LEFT JOIN branze ON (branze.id=firmy.id_branzy) WHERE ( kontakty.id_handlowca='2' AND firmy.nazwa LIKE '%' ) GROUP BY handlowcy.id, kontakty.DATA ASC HAVING min( kontakty_all.DATA ) = data_spotkania;


Powoduje wyświetlenie tabelki:

count(firmy.id) | firmy.id | handlowcy.id | kontakty.DATA data_spotkania | min( kontakty_all.DATA
1 | 15 | 2 | 0000-00-00 00:00:01 | 0000-00-00 00:00:01
1 | 14 | 2 | 2001-01-11 18:59:24 | 2001-01-11 18:59:24
12 | 2 | 2 | 2005-01-03 23:37:44 | 2005-01-03 23:37:44
4 | 3 | 2 | 2005-01-03 23:42:26 | 2005-01-03 23:42:26
22 | 4 | 2 | 2005-01-04 10:10:10 | 2005-01-04 10:10:10
8 | 5 | 2 | 2005-01-04 22:31:58 | 2005-01-04 22:31:58

Ogólnie rzecz biorąc identyczne zapytanie wyświetla mi rekordy w bazie i jest ok ale policzyć tego nie potrafie:(

Czy aby
  1. GROUP BY handlowcy.id
nie powinno załatwiać sprawy? A jeśli tak to czemu nie załatwia?
DeyV
ciągle czekam na wycinek z bazy ...
xamil
Zrzut:
http://www.k1.klecza.pl/~kamil/zrzut.txt
Pare rzeczy zostało wyciętych ale powinno działać;)


Czy ktoś jest w stanie rozwiązać mój problem?
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.