krzesik
30.04.2019, 20:09:07
Witam
mam problem z poprawną konstrukcją zapytania
mam dwie tablice:
[info]
id_info, tresc, data_do, woj, potwierdzenie
oraz drugą
[PotwierdzeniaKomunikatow]
idKomunikatu, imie_nazwisko, id_info, data_potwierdzenia
informacje mogą dotyczyć kilku województw jednocześnie, więc może występować jedna informacja dla kilku województw z czasem zakończenia identycznym (data_do)
mam tabelę gdzie widzę ilość osób które przeczytały komunikat zgrupowany ze wszystkich wojew.
SELECT id_info, count(DISTINCT(imie_nazwisko)) AS ilosc, info, data_do, id_info, woj FROM
(
SELECT * FROM info LEFT JOIN PotwierdzeniaKomunikatow ON info.id_info = PotwierdzeniaKomunikatow.IdKomunikatu WHERE potwierdzenie='1'
) AS tab1
GROUP BY info, data_do
ORDER BY id_info DESC
to działa mi dobrze, ale chciałbym otrzymać listę osób które przeczytały informację
trueblue
30.04.2019, 20:26:32
Dlaczego łączysz tabele po polach:
info.id_info = PotwierdzeniaKomunikatow.IdKomunikatu
a nie
id_info?
Skąd się wzięło pole
info w klauzuli GROUP BY?
krzesik
30.04.2019, 20:42:01
oczywiście powinno być tresc
Kshyhoo
30.04.2019, 20:49:38
To samo uzyskasz zapytaniem:
SELECT id_info, count(DISTINCT(imie_nazwisko)) AS ilosc, data_do, woj, tresc
FROM info
LEFT JOIN PotwierdzeniaKomunikatow ON info.id_info = PotwierdzeniaKomunikatow.IdKomunikatu WHERE potwierdzenie='1'
GROUP BY id_info, data_do
ORDER BY id_info DESC
A nazwisko wystarczy dołączyć:
SELECT id_info, count(DISTINCT(imie_nazwisko)) AS ilosc, data_do, woj, tresc, imie_nazwisko
FROM info
LEFT JOIN PotwierdzeniaKomunikatow ON info.id_info = PotwierdzeniaKomunikatow.IdKomunikatu WHERE potwierdzenie='1'
GROUP BY id_info, data_do
ORDER BY id_info DESC
Chyba, że nie zrozumiałem dobrze...
krzesik
30.04.2019, 20:54:44
nie, chodzi mi o listę nazwisk które odczytały wiadomość o tej samej treści, ale dla różnych województw
Kshyhoo
30.04.2019, 20:56:58
Pokaż przykładowe dane, po kilka z każdej z tabel.
krzesik
30.04.2019, 21:13:55
[info]
id_info, tresc, data_do, woj, potwierdzenie
1, będzie wiało, 2019-05-05, opolskie, 1
2, będzie wiało, 2019-05-05, pomorskie, 1
3, będzie padać, 2019-05-05, opolskie, 1
4, będzie bardzo padać, 2019-05-05, opolskie, 1
[PotwierdzeniaKomunikatow]
idKomunikatu, imie_nazwisko, id_info, data_potwierdzenia
1, kowalski adam, 1, 2019-04-30
2, maliniak stefan, 1, 2019-04-29
3, czereśniak karol, 1, 2019-04-30
4, kowalski adam, 2, 2019-04-29
5, kowalski adam, 3, 2019-04-30
6, kowalski adam, 4, 2019-04-29
7, maliniak stefan, 3, 2019-04-30
Kshyhoo
30.04.2019, 21:21:48
A to potwierdzenie to informacja o odebraniu wiadomości czy o tym, że będzie miało miejsce zdarzenie?
Kshyhoo
30.04.2019, 21:24:39
W takim razie, uważam, że miejsce trzymania tej informacji jest niepoprawne. Powinno być w tabeli z potwierdzeniem...
krzesik
30.04.2019, 21:37:37
Niestety tak już mam, da się coś wymyślić w takim układzie?
Kshyhoo
30.04.2019, 21:46:25
Nic sensownego, bo niby jak? Twoje potwierdzenie oznacza, wiadomość jest odczytana, ale nie masz informacji, kto odczytał. W Twoim rozwiązaniu trzeba by powielać rekordy w tabeli z potwierdzeniami i wydaje mi się, że właśnie tak robisz...
SELECT info.id_info, count(DISTINCT(imie_nazwisko)) AS ilosc, data_do, woj, tresc, imie_nazwisko, idKomunikatu
FROM info
LEFT JOIN PotwierdzeniaKomunikatow ON info.id_info=PotwierdzeniaKomunikatow.IdKomunikatu WHERE potwierdzenie='1'
GROUP BY PotwierdzeniaKomunikatow.id_info, data_do
ORDER BY id_info DESC
EDIT: dodałem idKomunikatu, dla sprawdzenia, co pobiera.
krzesik
30.04.2019, 21:55:46
Pole potwierdzenie w tabeli info jast wyłącznie informacją że ta wiadomość musi być potwierdzona że user przeczytał. Samym potwierdzeniem przeczytania jest rekord w tabeli PotwierdzeniaKomunikatow
krzesik
30.04.2019, 22:16:04
dalej w wyniku mam sume potwierdzeń, a potrzebuje nazwiska
Kshyhoo
30.04.2019, 22:36:03
Dziwne, bo ja mam tak:
id_info ilosc data_do woj tresc imie_nazwisko idKomunikatu
2 2 2019-05-05 00:00:00 pomorskie będzie wiało maliniak stefan 2
1 2 2019-05-05 00:00:00 opolskie będzie wiało kowalski adam 1