Autor Zpráva
danhill
Profil
Ahoj, potřeboval bych poradit jak sestavit správný dotaz kdy jsou hodnoty WHERE dané uživatelským filtrem na základě selectů.
V současnosti to mám řešené na úrovní php a všechny varianty jsou "vyifované" a pro každou variantu je tedy samostaný dotaz.
Což je ale ovšem značně nepraktické a hlavné rozšiření takového filtru je kvadratická rovnice,kdy s každou další položkou stoupne počet dotazů dvojnásobně.
Takže mám tedy např. tabulku.
id//date//name//id_type//id_country//id_region//id_verify//id_archive

všechno s prefixem id jsou id hodnot z jiných tabulek, tedy uživatel vidí samozřejmě hodnoty z joinu do jiných tabulek,ale to je jedno, o to tady celkem nejde.
Následuje uživatelský filtr:
input - date (od)
select - type
select - country
select - region
select - verify
select - archive

A já teď potřebuji dotaz,který by mi vrátil výsledek vždy podle vyplněných hodnot.
Což taky není úplně problém. Napíšu to ať je to srozumitelné "natvrdo" :)
SELECT * FROM table WHERE date>='datum od - nebo default datum' AND id_type = $_POST[type] AND id_country =$_POST[country], atd.

Takhle by to nádherně fungovalo na jeden jediný dotaz.
Ale co když uživatel nezadá konkrétní hodnotu v selectu? A chce tedy mít ve výsledku všechny kraje v čr?
Jak bude vypadat dotaz který bude vracet vše, pokud je value ze selectu empty??? Tedy:
SELECT * FROM table WHERE date>='datum od - nebo default datum' AND id_type = $_POST[type] AND id_country =$_POST[country](10-CR) AND id_region = 'ALL', atd.

Těch variant je velmi mnoho, lze tohle vůbec nějak ošetřit jedním dotazem?
Mě třeba napadla možnost,kdyby se dalo = uložit do proměnné a já bych si volil = nebo != podle konstrukce dotazu, tedy v tomto případě bych použil :
SELECT * FROM table WHERE date>='datum od - nebo default datum' AND id_type = $_POST[type] AND id_country =$_POST[country](10-CR) AND id_region != '', atd.

Ale nevím jak to udělat.
Děkuji za pomoc.
Kajman
Profil
Když uživatel nezadá konkrétní hodnotu, tak do where patřičnou část vůbec nedáte.
danhill
Profil
A jak toho docílím samotném dotazu???
Kajman
Profil
Budete si dotaz postupně skládat podle toho, zda byla podmínka vyplněná nebo ne. Pokud nepoužíváte databázový framework a děláte dotazy ručně, tak např.

$podminky=" WHERE date>='2016-10-17";
if(isset($_POST['type']) && !empty($_POST['type']))
{
  $podminky.=" AND id_type=".(int)$_POST['type'];
}
if(isset($_POST['country']) && !empty($_POST['country']))
{
  $podminky.=" AND id_country='".mysqli_real_escape_string($spojeni_mysqli, $_POST['country'])."'";
}
danhill
Profil
No no no ... tohle potřebuji, jak se to dělá ... Právě já nevím jak tu proměnnou $podminky dostanu do toho dotazu.
To přeci nemůžu udělat že místo
SELECT * FROM table WHERE date>='datum od - nebo default datum' AND id_type = $_POST[type]
napíšu
SELECT * FROM table WHERE $podminky
Kajman
Profil
V příkladu je klíčové slovo where obsaženo již v proměnné $podminky, ale jinak to samozřejmě jde, stačí spojit řetězce.

$podminky = "...";
$dotaz = 'SELECT * FROM table ' . $podminky . ' ORDER BY 1';
danhill
Profil
Jaj, no tak to je pak samozřejmě jasné :) To je moc fajn, že to tak jde ... Sakra,že jsem se nezeptal dříve :)
Moc děkuji. Tohle mi ušetří skoro 200 řádků nepřehledného kodu ...

Ještě se zeptam, jako doplňujicí otázku.
Lze sestavit dotaz i z pole? Kde budou jen hodnoty a nikoli celé části dotazu?
Ted plácnu nesmysl,ale pro názornost něco jako:
SELECT * FROM table WHERE id = array(10,23,15,18,52,34)

Každopádně děkuji moc za to vysvětlení ... Zase jsem chytřejší :)
juriad_
Profil *
$q = "SELECT * FROM table WHERE id IN (" . implode(', ', array(10,23,15,18,52,34)) . ")"
Pozor však, toto neříká nic o pořadí vrácených záznamů.


SQL dotaz můžeš skládat skoro neomezeně. Nedávno jsem tu psal jednu ukázku, která je založená na polích: "Multi" vyhledávání
danhill
Profil
Super ... tak tohle je mocné ... pro filtry naprosto úžasné, konečně nebude přidání položky do filtru moje noční můra ale otázka pár minut ...
Moc děkuji ...
Tak řadit to pak můžu normálně ORDER BY , ne? Nebo si vytvořím už seřazené pole, to by taky mohlo fungovat,ne?
Jdu kouknout na tu ukázku.
Keeehi
Profil
danhill:
ORDER BY je ta správná možnost.

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: