Autor Zpráva
sopel
Profil *
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
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
a pak už jen seřaďte podle nullovosti
order by op.id_objektu is null, ...
sopel
Profil *
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 *
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).

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:

0