Autor | Zpráva | ||
---|---|---|---|
piiiiiiiip Profil |
Dobrý den.
Spojil jsem tři tabulky ale výsledná nette aplikace se chová úplně špatně. Potřebuji aby uživatelé mohly ohodnotit jiného uživatele (který vkládá obsah). Po udělení hodnocení by uživatel měl zmizet ze seznamu. return $this->database->query('SELECT images.owner, images.img, user.username, user.lat, user.long, user.age, user.user_id, votes.voter, votes.voteusername FROM user left join votes on votes.voter = user.username LEFT JOIN images ON images.owner = user.username ')->fetchAll(); Chová se to ale úplně jinak. Místo toho aby se počet vypsaných uživatelů v seznamu řídil počtem uživatelů v tabulce user se řídí počtem hodnocení které uživatelé udělily. |
||
xROAL Profil |
piiiiiiiip:
„Chová se to ale úplně jinak.“ Chová sa to presne tak, ako by sa LEFT JOIN chovať mal.
Vyberie všetko z "ľavej" tabuľky (v tvojom prípade user ) a k nej zodpovedajúce záznamy z "pravej" tabuľky (votes ). Ak je v "pravej" tabuľke viac zodpovedajúcich záznamov, záznamy z "ľavej" tabuľky sa budú opakovať.
Ak chceš každého užívateľa len raz, musíš použiť vhodný GROUP BY alebo votes nahradiť vhodnou query (nápoveda: LIMIT 1 ) - potom ale nebudeš mať všetky hodnotenia.
|
||
Časová prodleva: 8 dní
|
|||
piiiiiiiip Profil |
xROAL:
GROUP BY jsem také zkoušel ale nedosáhl jsem požadovaného výsledku. return $this->database->query('SELECT images.owner, images.img, user.username, user.lat, user.long, user.age, user.user_id, votes.voter, votes.voteusername FROM user left join votes on votes.voter = user.username LEFT JOIN images ON images.owner = user.username WHERE user.username <> votes.voteusername GROUP BY user.username ')->fetchAll(); Obrázek se k nim přiřadí ale nevypisují se. Zatím to vypadá že se vypíší pouze ti u kterých se user.username rovná votes.voteusername což by mělo být obráceně. |
||
Tomášeek Profil |
#4 · Zasláno: 16. 2. 2017, 09:26:58
piiiiiiiip:
Neměl bys v té podmínce mít WHERE votes.voter IS NULL ?
LEFT JOIN , pokud se nemýlím, záznamy, které nenajde, vrací jako NULL
|
||
piiiiiiiip Profil |
#5 · Zasláno: 16. 2. 2017, 09:43:29
Tomášeek:
Ne to se nevypíše jen ten přihlášený uživatel, ty ke kterým už volil zůstanou. |
||
Kajman Profil |
#6 · Zasláno: 16. 2. 2017, 11:05:00
A když má uživatel k hodnocení více obrázků, tak má být v seznamu vícekrát (pro každý obrázek)?
Proč si obrázky a hlasování nespojujete podle user_id? Pak by totiž nevadila změna username a výkon by byl také nepatrně lepší. |
||
piiiiiiiip Profil |
#7 · Zasláno: 16. 2. 2017, 11:09:45
Username se nemění, je to email. Momentálně je podporovám pouze jeden obrázek pro každého uživatele to ale není problém, to funguje. Problém je ve výpisu těch uživatelů. Na to id to potom přehodím, na username to mám jen tet abych se v tom neztrácel.
|
||
Kajman Profil |
#8 · Zasláno: 16. 2. 2017, 11:19:57
Na images dělejte inner join, aby tam byli jen uživatelé s fotkou. Hlasování pak zkusíte připojit přes left join a s podmínkou, že aktuální uživatel hlasoval pro toho konkrétního uživatele. A díky where omezíte řádku na ty, které se nepovedl připojit - tedy pro ně ještě nehlasoval. A můžete i omezit, že nechcete aby hlasoval sám pro sebe.
SELECT images.owner, images.img, user.username, user.lat, user.long, user.age, user.user_id, votes.voter, votes.voteusername FROM user JOIN images ON images.owner = user.username LEFT join votes ON votes.voter = 'email@prihlaseneho.uzivatele' and votes.voteusername = user.username WHERE votes.voter is null and user.username != 'email@prihlaseneho.uzivatele' |
||
piiiiiiiip Profil |
To mi vrátí jen přihlášeného uživatele pokut pro sebe nevolil.
Trochu jsem to upravil a zatím to vypadá dobře. Děkuji za pomoc. |
||
Časová prodleva: 6 let
|
0