Autor Zpráva
lokix
Profil
Zdravím všechny zde na fóru,

chtěl bych poprosit, požádat o info nebo se i raději domluvit (placená zakázka) na postupu jak vyřešit jeden docela velký problém - teda pro mě ;)
Nejdřív se chci informovat a asi to nakonec přesunu k zakázkám, ale rád bych znal Váš názor zdali vůbec něco takového je možné pomocí php a mysql.

O co se vlastně jedná:
Pomocí formu ukládám údaje od zákazníku (se souhlasem a legálně) do mysql db. Je tam cca 20 inputů (jméno,příjmení, atd...) to není problém, ale potřebuju pro zákazníka udělat to, že on má další zákazníky co od něj berou ty záznamy, ale každý má jiné požadavky. Pan X chce jen z toho kraje a do té částky, pan Y zase z toho kraje + dalšího a dalšího kraje a téhle částky, ale ne ty co už má pan X a další pán Z chce vše, ale ne to co má pan X a Y ale taky aby tam nebyly duplicity, ale každý třeba 5 den se zase můžou přidat i duplicity těch 5 dní staré - né mladší.

Je to docela maglajs a tak se ptám Vás Mágů jestli je něco takového možné řešit a jak. Nečekám návod, ale spíš pomoc pokusit se to vysvětlit jestli to jde a pak se domluvit spíš na té zakázce. Zálohu pošlu klidně dopředu, ale očekávám solidní jednání a samo domluvení dobré ceny. Většinu zvládnu sám, ale tu db mě hlava takhle nebere.

Předem všem děkuji za pomoc a omlouvám se, že je to tady a né v zakázkách, ale potřebuju spíš vědět jestli je to takto možné než to tam přesunu.
tiso
Profil
Potrebuješ si nejakým spôsobom uložiť do databázy tie podmienky, ako má ten odber vyzerať, a potom na základe toho poskladať výsledok - SQL dotazy + možno ešte filtrovanie v PHP alebo čom. Riešiteľné by to malo byť.
lokix
Profil
tiso:
Vím, že to tady nepatří, ale nebyl by jsi ochotný mi s tím pomoct? Určitě né zadarmo a ty jsi jeden z nej tady tak by to za to pro mě stálo.
Alphard
Profil
lokix:
Jestli to chcete přesunout do Prací a zakázek, uveďte prosím explicitně kontakt, tamní pravidla to vyžadují. Pak to přesunu.

Jinak kdybych trochu rozvedl to, co psal tiso. Podmínky je třeba nějak formalizovat, abyste je mohl uložit do vhodně normalizovaných tabulek. To bude zřejmě vyžadovat jejich rozdělení a uložení do více řádků a možná i více tabulek. To je ta nejtěžší část, až budete mít popsáno, co kdo chce, potřebný dotaz už se vygeneruje relativně snadno.
lokix
Profil
Alphard:
Díky za info, ale už to řeším s tiso tak se to tady může locknout.
tiso
Profil
Riešenie (filter dát z jednej tabuľky) vyzerá zhruba takto:
DailyFilter.class.php
<?php
class DailyFilter
{
    private $sql = array('where' => array());
    private $union = array();
    private $filterId = null;
    private $date = null;
    
    public function __construct($filterId, $date) {
        $this->filterId = $filterId;
        $this->date = $date;
    }
    
    public function union($param = null)
    {
        $this->union[] = $this->sql;
        $this->sql = array('where' => array());
    }
    
    public function withoutDuplicities($param)
    {
        $this->sql['groupBy'] = $param;
    }
    
    public function regionIn($param)
    {
        $this->sql['where'][] = "region_id IN($param)";
    }
    
    public function priceHigher($param)
    {
        $param = (int)$param;
        $this->sql['where'][] = "price > $param";
    }
    
    public function priceLower($param)
    {
        $param = (int)$param;
        $this->sql['where'][] = "price < $param";
    }
    
    public function notInResult($param)
    {
        $param = (int)$param;
        $query = "SELECT result FROM daily_result WHERE date = '$this->date' AND filter_id = $param";
        $queryResult = mysql_query($query);
        if ($queryResult) {
            $result = mysql_result($queryResult, 0, 0);
            $this->sql['where'][] = "id NOT IN ($result)";
        }
    }
    
    public function notInResults($param)
    {
        $query = "SELECT result FROM daily_result WHERE date = '$this->date' AND filter_id IN ($param)";
        $queryResult = mysql_query($query);
        if ($queryResult) {
            $results = array();
            while ($row = mysql_fetch_assoc($queryResult)) {
                $results[] = $row['result'];
            }
            $ids = explode(',', implode(',', $results));
            $ids = array_unique($ids);
            $result = implode(',', $ids);
            $this->sql['where'][] = "id NOT IN ($result)";
        }
    }
    
    public function save()
    {
        $query = "INSERT INTO daily_result (SELECT NULL AS id, $this->filterId AS filter_id, date, group_concat(id) as result FROM ({$this->buildUnion()}) sub)";
        mysql_query($query);//TODO: return?
    }
    
    private function buildUnion()
    {
        $this->union[] = $this->sql;
        $q = array();
        foreach ($this->union as $sql) {
            $q[] = $this->buildQuery($sql);
        }
        $query = "(" . implode(") UNION (", $q) . ")";
        return $query;
    }
    
    private function buildQuery($sql)
    {
        $query = "SELECT id, date FROM source_table WHERE (date = '$this->date')";
        if (!empty($sql['where'])) {
            $query .= " AND (" . implode(") AND (", $sql['where']) . ")";
        }
        if (!empty($sql['groupBy'])) {
            $query .= " GROUP BY {$sql['groupBy']}";
        }
        return $query;
    }
}

cron.php
<?php
//pripojenie k databaze, include, ...

$date = date('Y-m-d', time() - 86400);//vcera
$query = "SELECT id FROM filter WHERE is_active = 1 ORDER BY position";
$result = mysql_query($query);
while ($row = mysql_fetch_assoc($result)) {
    $filterId = $row['id'];
    $query2 = "SELECT method, value FROM condition JOIN filter_condition ON condition.id = filter_condition.condition_id WHERE filter_id = $filterId ORDER BY position";
    $result2 = mysql_query($query2);
    $DailyFilter = new DailyFilter($filterId, $date);
    while ($row2 = mysql_fetch_assoc($result2)) {
        $method = $row2['method'];
        $value = $val['value'];
        $DailyFilter->$method($value);
    }
    $DailyFilter->save();
}

Databáza
source_table(id, region_id, date, price, ...)
filter(id, name, is_active, position)
condition(id, method)
filter_condition(id, filter_id, condition_id, value, position)
daily_result(id, filter_id, date, result)

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0