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.
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();
Tento kod by měl vypsat uživatele z tabulky user kteří nebyly hodnoceni v tabulce votes a přiřadit k nim obrázek.
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
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
Tomášeek:
Ne to se nevypíše jen ten přihlášený uživatel, ty ke kterým už volil zůstanou.
Kajman
Profil
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: