Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Problem z konstrukcją zapytania
Forum PHP.pl > Forum > Przedszkole
krzesik
Witam, coś mam kłopot z poprawną konstrukcją zapytania, proszę o pomoc w temacie

mam tabelę tab1

id_tab1 | nazwisko | data

1 | Kowalski | 2016-08-04
2 | Maliniak | 2016-09-24
3 | Kowalski | 2016-10-05
4 | Stefaniak | 2016-11-04

oraz drugą tabelę tab2

id_tab2 | id_tab1 | ilosc
1 | 1 | 1
2 | 1 | 2
3 | 1 | 1
4 | 2 | 1
5 | 2 | 1
6 | 3 | 1


muszę podać wynik w postaci:
- ilość wizyt poszczególnych klientów wg nazwisk
- ilość zabiegów
ograniczając do daty początkowej większej niż...

wiem jak policzyć ilość wizyt:
  1. $pyt1 = "select nazwisko as NazwiskoPacjenta, count(nazwisko) as IloscWizyt WHERE data>='RRR-MM-DD'";

próbowałem połączyć tabele JOIN-em, ale jeśli jest więcej rekordów niż jeden to źle mi zaczyna liczyć......

prosze o pomoc

trueblue
Połącz tak jak łączyłeś, albo poprzez WHERE.
Po WHERE z datą dodaj GROUP BY nazwisko
Kshyhoo
Jeżeli druga tablica zawiera odnośniki do ID z pierwszej i ilość zabiegów, to:
  1. SELECT t1.nazwisko AS NazwiskoPacjenta, count(t2.ilosc) AS IloscWizyt
  2. FROM tab2 t2
  3. LEFT JOIN tab1 t1 ON t1.id_tab1=t2.id_tab2
  4. WHERE data>='2016-08-04'
  5. GROUP BY ilosc
krzesik
coś jest chyba nie tak, mam połączyć tabele poprzez identyfikator id_tab1 z identyfikatorem id_tab2?
chciałem zrobić to tak:
  1. SELECT nazwisko AS NazwiskoPacjenta, count(nazwisko) AS IloscWizyt, DATA AS DATA FROM tab1 WHERE data>='RRR-MM-DD'

to mi da ilość wizyt

  1. SELECT sum(ilosc) AS IloscZabiegow FROM tab2 GROUP BY id_tab1

to mi da ilość zabiegów

jeśli robię:
  1. SELECT * FROM (
  2. SELECT nazwisko AS NazwiskoPacjenta, count(nazwisko) AS IloscWizyt, DATA AS DATA FROM tab1
  3. LEFT JOIN tab2 ON id_tab1=id.tab2) AS tab3


nawet bez warunków, to jeśli trafi na np trzy rekordy w tab2 to mnoży mi te ilości......
Kshyhoo
Moje zapytanie liczy ilość zabiegów (zlicza ilości z tab2).
trueblue
Łączysz przez id_tab1
Żadne podzapytania nie są potrzebne. Wszystko w jednym zapytaniu: połączenie przez JOIN/LEFT JOIN/WHERE, WHERE z datą, GROUP BY.
Kshyhoo
Napisz, co zawierają obie tabele.
krzesik
dokładnie to:

tab1
id_tab1 | nazwisko | data

1 | Kowalski | 2016-08-04
2 | Maliniak | 2016-09-24
3 | Kowalski | 2016-10-05
4 | Stefaniak | 2016-11-04

tab2

id_tab2 | id_tab1 | ilosc
1 | 1 | 1
2 | 1 | 2
3 | 1 | 1
4 | 2 | 1
5 | 2 | 1
6 | 3 | 1


moim zdaniem Twoje zapytanie liczy ilośc rekordów zabiegów, ich ilość sum(ilosc) group by id_tab1 - to moim zdaniem liczy ilość zabiegów, jeśli dołożę do tab2 nazwisko - będzie lepiej?
Kshyhoo
Wynik mojego zapytania:
  1. +------------------+------------+
  2. | NazwiskoPacjenta | IloscWizyt |
  3. +------------------+------------+
  4. | Kowalski | 3 |
  5. | Maliniak | 1 |
  6. +------------------+------------+


Ja uważam, że masz źle skonstruowane tabele, bo pierwsza powinna zawierać tylko dane pacjenta a druga zabiegi... a jeszcze lepiej:
1. pacjenci
2. zabiegi
3. tablica łącząca rekordy tabel 1 i 2
krzesik
Oczekiwałbym wyniku:
  1. +------------------+------------+------------+
  2. | NazwiskoPacjenta | IloscWizyt |IloscZabiegow |
  3. +------------------+------------+------------+
  4. | Kowalski | 2 | 5
  5. | Maliniak | 1 | 2
  6. | Stefaniak | 1 | 1
  7. +------------------+------------+------------+
Kshyhoo
To by trzeba podzapytaniami robić. Lepiej zmienić konstrukcję tabel.
trueblue
Co przechowują poszczególne pola w tabeli tab2?
krzesik
- id rekordu
- id rekordu wizyty
- ilość zabiegów
trueblue
To teraz powiedz na jakiej podstawie w Twojej tabeli Kowalski ma 5 zabiegów.
Pewnie na takiej podstawie, że powinieneś połączyć poprzez pole id_tab1, o czym pisałem wyżej.
Tyle, że skąd u Ciebie ilość wizyt Stefaniaka, skoro w tabeli tab2 nie ma wartości 4 w polu id_tab4?
Pewnie dlatego, że podałeś niepełne zawartości tabel...

  1. SELECT nazwisko, COUNT(DISTINCT t2.id_tab1), SUM(t2.ilosc)
  2. FROM tab1 AS t1,tab2 AS t2
  3. WHERE t1.id_tab1=t2.id_tab1
  4. GROUP BY nazwisko


A teraz rozjaśnij dlaczego wizyta Kowalskiego (id 1) jest rozbita na ilości: 1, 2, 1?
krzesik
i jeszcze male pytanie, dlaczego mam zwrotkę z zapytanie że kolumna t2.start jest nieznana?

  1. SELECT
  2.  
  3. IF(MONTH(`t2.start`)>3,cast(CONCAT(YEAR(`t2.start`), '/', YEAR(`t2.start`)+1) AS char),cast(CONCAT(YEAR(`t2.start`)-1, '/', YEAR(`t2.start`)) AS char)) AS `sezon`,
  4. t2.start AS DATA, t2.imie_nazwisko, count(DISTINCT t2.id_book) AS wizyty, sum(t1.ilosc) AS ilosc
  5. FROM tabela1 AS t1,tabela2 AS t2
  6. WHERE t1.id_book=t2.id_book AND sezon='2016/2017' GROUP BY t2.imie_nazwisko


jeśli usunę IF....... to mam daty poprawne, ale muszę później filtrować po sezonie
trueblue
`t2`.`start` albo t2.`start`
krzesik
ok bez warunku sezon='2016/2017' działa, ale z warunkiem już nie....
trueblue
W klauzuli WHERE nie można używać warunku opartego o alias.
Musisz powtórzyć całe obliczenie, albo zastosuj tam krótszy warunek oparty o YEAR().
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.