Autor | Zpráva | ||
---|---|---|---|
sopel Profil * |
#1 · Zasláno: 27. 9. 2015, 13:45:01
Zdravím,
potřeboval bych poradit se sql příkazem - snažím se seřadit všechny objekty, ale potřebuji aby se v první řadě zobrazovali objekty "TOP". Mám 2 tabulky: 1) web_objekty ( id, nazev, informace, cena, kategorie, status, datum_pridani ) 2) web_objekty_top ( id_objektu, datum_zacatku, datum_dokonce ) Aktuální příkaz vypadá bez zapojení 2 tabulky takto - status (znamená aktivní objekt) seřazeno dle data přidání SELECT * FROM `web_objekty ` WHERE `status`='1' ORDER BY datum_pridani DESC LIMIT 0, 12 Nyní se objekty zobrazuji pod sebou, aktivní - dle data přidání. Potřebuji, aby objekty, které jsou v tabulce web_objekty_top a které mají "datum_dokonce" < než aktuální time(), aby se zobrazovali NAD všemi objekty ( dle nejnovějšího "datum_zacatku" ) . Dokázal by mi s tím někdo pomoct? Děkuji !! |
||
Dan Charousek Profil |
#2 · Zasláno: 27. 9. 2015, 14:04:36
sopel:
Rozumím čeho se zde snažíš dosáhnout, ale je nějaký důvod, proč pro topované objekty existuje speciální tabulka? Osobně bych to řešil jedním (případně dvěma) slupci navíc v tabulce web_objekty. Tato funkcionalita mi připomíná topování inzerátů na různých portálech. Řekněme, že chce zákazník topovat inzerát s id=5. Zaplatí, platba se přiřadí k němu a inzerátu s id 5 se aktualizuje sloupec (např.: "top_do") na NOW() + pocet_dní_v_topovaných Pak je řazení značně jednodušší. |
||
Alphard Profil |
sopel:
„a které mají "datum_dokonce" < než aktuální time()“ Nechcete to obráceně? V každém případě, dopište k tomu připojení tabulky spolu s tou podmínkou na datum left join web_objekt_top op on o.id = op.id_objektu and datum_zacatku < DATE and datum_dokonce > DATE order by op.id_objektu is null, ... |
||
sopel Profil * |
#4 · Zasláno: 27. 9. 2015, 14:57:42
Alphard, děkuji, již jsem to udělal a funguje.
Mohu ještě dotaz ? Potřebuji zapojit úplně stejný příkaz - ale doplnit ho ještě o jednu tabulku navíc s tím, že v té tabulce jsou pouze IP/ID objektu/ datum. A celkově to zapisuje počet shlédnutí objektu..tedy pokuse nachází 10 záznamů tak bude objekt výš, než objekt, který má pouze 5 záznamů shlédnutí ( samozřejmě nad němi budou TOP objekty ) tak něco jsem zkusil nějak takto, poradíte ?. SELECT * FROM web_objekty obj LEFT JOIN web_objekty_top op ON obj.id = op.id_objektu LEFT JOIN ( SELECT COUNT(*) FROM web_objekty_zobrazeni WHERE id_objektu=obj.id) AS celkovyPocet FROM web_objekty WHERE obj.status='1' ORDER BY op.status DESC , obj.celkovyPocet DESC LIMIT 0, 100"; |
||
Alphard_ Profil * |
#5 · Zasláno: 27. 9. 2015, 15:42:19
Korelovaným dotazům bych se raději vyhnul.
Lepší snad bude připojit tabulku vytvořenou ze seskupených dat left join (select id_objektu, count(id_objektu) from web_objekty_zobrazeni group by id_objektu) visits on obj.id = visits.id_objektu Na tenhle dotaz pozor, jestli tam nedáte dobře indexy, začne to s rostoucím počtem dat zpomalovat. Pokud by bylo možné omezit se na např. měsíc staré záznamy, tím lépe (to by v tomto případě bylo zřejmě rozumné i uživatelsky, jinak vám tam pořád budou viset stejné věci). |
||
Časová prodleva: 9 let
|
0