Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno MSSQL - Obdoba Facebooku - výpis příspěvků na zdi - nefunkční výpis počtu liků

Ahoj, vytvářím takovou jednoduchou obdobu facebooku a blbne mi jeden SQL příkaz. Přesněji řečeno nevypíše vůbec nic, ani chybovou hlášku.
Má za úkol vypsat všechny příspěvky na zdi uživatele, jehož přezdívku zadá uživatel do textfieldu.

V DB mám tabulky libiSe, uzivatel, zed, prispevek, viz. databázový diagram.

Zde je select:

select
prispevek.prisp_id,
prispevek.datum,
(select prezdivka from uzivatel where uziv_id = prispevek.uziv_fk) as Autor,
(select count(libiSe.prisp_fk) from libiSe group by libiSe.prisp_fk) as Pocet_libiSe,
prispevek.obsah as obsah
from prispevek inner join
libiSe on libiSe.prisp_fk=prispevek.prisp_id
inner join zed on prispevek.zed_fk = zed.zed_id
where zed.uziv_fk = (select uzivatel.uziv_id from uzivatel where prezdivka='jirik1');

Popis selectu: vypíše id příspěvku, jeho datum, podle id v příspěvku jméno autora a obsah. Na konci klauzule where zajištuje to, že se vypíší jen ty příspěvky, které patří na zed uživatele ,,jirik1".

Bez zjišťování počtu liků select funguje bezchybně. Jakmile jsem ale přidal ten count na liky, příkaz nevypisuje absolutně nic,

Prosím o pomoc, děkuji.

Předmět Autor Datum
Protože v tom subselectu ti chybí omezení na konkrétního uživatele.
Wikan 08.10.2016 18:44
Wikan
Díky za odpověď. O uživatele v tom subselectu s počty lajků vůbec nejde. Tam jde čistě jen o ty počt…
jungle-be 08.10.2016 19:24
jungle-be
Tak jinak, ten subselect musí vrátit jedinou hodnotu. Pokud to jich vrací víc, tak se to nedá použít…
Wikan 08.10.2016 19:30
Wikan
To jsem pochopil, ale jak to omezit aby to vypsalo jen pro ten kokrétní řádek, konkrétní příspěvek,…
jungle-be 08.10.2016 19:37
jungle-be
Co tohle? select count(*) from libiSe where libiSe.prisp_fk = prispevek.prisp_id
Wikan 08.10.2016 19:41
Wikan
Bohužel pořád stejné. Žádný error, jen prázdný výpis v konzoli.
jungle-be 08.10.2016 19:50
jungle-be
Ten subselect ti nemôže ovplyvniť hlavný select. Každopádne si tam najoinuj aj tabuľku užívateľov. L…
čitateľ 08.10.2016 19:59
čitateľ
Ten group by v subselecte mi príde ako nezmysel, tam mala byt len where podmienka
čitateľ 08.10.2016 19:40
čitateľ
Souhlasím s Vámi, ale zatím to různě střídám a zkouším, protože původní myšlenka bohužel nefungovala…
jungle-be 08.10.2016 19:51
jungle-be
Tak už jsem to vykoumal :) Tady je select: select prispevek.prisp_id, prispevek.datum, (select p…
jungle-be 09.10.2016 11:19
jungle-be
Možná to funguje, ale je to šíleně neoptimalizované. Teď, když máš desítky záznamů v DB je to fajn,…
Jan Fiala 09.10.2016 14:15
Jan Fiala
V realu by na tohle jen blazen pouzil relacni DB...
MaSo 09.10.2016 21:27
MaSo
Proč ne? Relacní DB je na tm výkonem pořád líp než objektové databáze. Ty se hodí tam, kde nemáš jas…
Jan Fiala 10.10.2016 06:19
Jan Fiala
Tohle je IMHO super kandidát na NoSQL dokumentovou DB (třeba MongoDB), kvůli možnosti ukládat přímo… poslední
MaSo 10.10.2016 09:13
MaSo

Díky za odpověď.
O uživatele v tom subselectu s počty lajků vůbec nejde.
Tam jde čistě jen o ty počty lajků u daného příspěvku a je jedno, kdo ten příspěvek dal.
Zkoušel jsem ještě do toho subselectu vložit upřesnění na id příspěvku stylem
where libiSe.prisp_fk = prispevek.prisp_id,
ale ani to nepomohlo.

Tak už jsem to vykoumal :)

Tady je select:

select
prispevek.prisp_id,
prispevek.datum,
(select prezdivka from uzivatel where uziv_id = prispevek.uziv_fk) as Autor,
(select count(libiSe.prisp_fk) as Pocet_lajku from libiSe
where libiSe.prisp_fk = prispevek.prisp_id group by libiSe.prisp_fk) as Pocet_liku,
prispevek.obsah as obsah

from
prispevek
inner join zed on prispevek.zed_fk = zed.zed_id
where zed.uziv_fk = (select uzivatel.uziv_id
from uzivatel where prezdivka='petr15');

Před tím jsem měl v tom selectu buď jen where nebo jen group by. Teď jsem tam dal obojí a odstranil inner join na libiSe.
A ono to, světe div se, konečně funguje.
Děkuji vám za rady :).

Možná to funguje, ale je to šíleně neoptimalizované.
Teď, když máš desítky záznamů v DB je to fajn, ale až tam budou statisíce vět, budou k tomu současně přistupovat desítky uživatelů a ty budeš muset pro každé načtení stránky ten select spustit 50x, protože budeš mít 50 příspěvků na zdi, tak potom uvidíš, jak to bude vypadat...

Tohle je IMHO super kandidát na NoSQL dokumentovou DB (třeba MongoDB), kvůli možnosti ukládat přímo JSON struktury a super podpory replikace přes nody v cluster prostředi. In-memoryDB se k tomu naopak moc nehodí, páč tam bude mega moc dat a replikace přes nody je v případě Im-memoryDB kapku problematická.

Zpět do poradny Odpovědět na původní otázku Nahoru