PHP - jaký algoritmus?
Ahoj.
Jsem přetažený, tak mi to málo myslí.
Mám následující dotaz:
SELECT additional_name, additional_value
FROM products_additional
WHERE TYPE = 'ADI'
AND products_id
IN ( 61508, 61501, 61512, 61507, 61500, 61511, 61509, 61510 )
ORDER BY additional_name
Tabulka vypadá takto:
Výsledek dotazu vypadá takto:
Jedná se o zboží v eshopu, které má různé filtry ve sloupci additional_name (podle stejného jména) různé hodnoty- sloupec additional_value .
A problém je následující:
Sloupec aditional_value může obsahovat jak řetězce, tak čísla.
Pokud obsahuje řetězce, měl by se zobrazit checkbox. (není problém!)
Pokud však obsahuje více čísel, měl by se zobrazit tzv. range slider s minimální a maximální hodnotou.
Můj dotaz je tedy jednoduchý, jak zjistit minimální a maximální hodnotu TíMTO DOTAZEM ?
Vymyslel jsem tohle:
$filtry = mysql_query("select additional_name, additional_value from products_additional where type='ADI' AND products_id in (".$id_pro_filtry.") order by additional_name, additional_value");
$dotayek = "select additional_name, additional_value from products_additional where type='ADI' AND products_id in (".$id_pro_filtry.") order by additional_name";
echo $dotayek.'<hr>';
$predchoziMinimalniHodnota;
$minimalniHodnota = 0;
$maximalniHodnota = 0;
$lastFilterName = '';
$poprvee = 1;
while($zakaznik = mysql_fetch_array($filtry)){
echo '<input type="checkbox" value="'. $zakaznik["additional_name"] .'">'. $zakaznik["additional_name"].'<br>';
if(is_numeric($zakaznik["additional_value"])){
if ($lastFilterName == $zakaznik["additional_name"])
{
if ($maximalniHodnota < $zakaznik["additional_value"])
$maximalniHodnota = $zakaznik["additional_value"];
$minimalniHodnota = $zakaznik["additional_value"];
if ($minimalniHodnota < $zakaznik["additional_value"])
$minimalniHodnota = $zakaznik["additional_value"];
}
$lastFilterName = $zakaznik["additional_name"];
$predchoziMinimalniHodnota = $zakaznik["additional_value"];
}
}
echo "<hr>";
echo $minimalniHodnota.'+'.$maximalniHodnota;
echo "<hr>";
Ovšem na konci se vždy vytiskne maximální hodnota (i v minimální).
Vidíte tam někdo chybku ?
Anebo bez zbytečných řečí to zjednodušit už na úrovni SQL.
Napadlo mě:
Což dá výsledek:
Jak prosím zobrazím DO TOHOTO výsledku sloupeček jménem additional_value ?
Určitě to někdo z vás vymyslí. Věřím vám!
A co v tom sloupečku má být?
To je velice správná otázka.
Zapomněl jsem se totiž zmínit, že někdy jsou v tomto sloupci čísla (u těch potřebuji znát max a min) a někdy řetězce.
A já tam potřebuji vypsat jen v těch případech, kdy tam budou řetězce ty řetězce.
Mimochodem pokud se bude jednat o rozdílné řetězce, tak všechny varianty (group by).
A už mlčím, už si nevymýšlím.
Je to vůbec řešitelné tím mým dotazem?
Prostě potřebuju, pokud je ve sloupečku additional_value řetězec, tak všechny jeho varianty.
Pokud je tam číslo, tak jeho maximum a minimum - V tomto případě stačí jednou.
Fakt to není tak složité, jak to popisuju.
SELECT additional_name, min( additional_value ) , case when isnumeric (additional_value) = 1 then max( additional_value ) else additional_value end as val
FROM products_additional
WHERE TYPE = 'ADI'
AND products_id
IN ( 61508, 61501, 61512, 61507, 61500, 61511, 61509, 61510 )
GROUP BY additional_name
ORDER BY additional_name, additional_value
Pěkný výstřel na branku !
Ale gól to není.
isnumeric totiž MySQL nezná.
Trying to use alternative function......
Děkuji zejména Warm_spiderovi.
Zdá se že funkční řešení pro MySQL vypadá následovně:
Pěkný den přeji !
nj, ja som odchovany na MSSQL :D mysql je moj 2nd adept. Ale hlavne, ze to pomohlo k najdeniu riesenia.