Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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:

[http://pc.poradna.net/file/view/14735-tabulka-png]

Výsledek dotazu vypadá takto:

[http://pc.poradna.net/file/view/14736-tabulka2-png  ]

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 ?

Předmět Autor Datum
Anebo bez zbytečných řečí to zjednodušit už na úrovni SQL. Napadlo mě: SELECT additional_name, min…
Flash_Gordon 09.07.2013 14:30
Flash_Gordon
A co v tom sloupečku má být?
Wikan 09.07.2013 14:31
Wikan
To je velice správná otázka. Zapomněl jsem se totiž zmínit, že někdy jsou v tomto sloupci čísla (u t…
Flash_Gordon 09.07.2013 14:36
Flash_Gordon
SELECT additional_name, min( additional_value ) , case when isnumeric (additional_value) = 1 then ma…
wam_Spider007 09.07.2013 14:41
wam_Spider007
Pěkný výstřel na branku ! Ale gól to není. isnumeric totiž MySQL nezná. Trying to use alternative…
Flash_Gordon 09.07.2013 14:46
Flash_Gordon
Děkuji zejména Warm_spiderovi. Zdá se že funkční řešení pro MySQL vypadá následovně: SELECT additi…
Flash_Gordon 09.07.2013 14:51
Flash_Gordon
nj, ja som odchovany na MSSQL :D mysql je moj 2nd adept. Ale hlavne, ze to pomohlo k najdeniu riesen… poslední
wam_Spider007 09.07.2013 15:11
wam_Spider007

Anebo bez zbytečných řečí to zjednodušit už na úrovni SQL.

Napadlo mě:

SELECT additional_name, min( additional_value ) , max( additional_value )
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

Což dá výsledek:

[http://pc.poradna.net/file/view/14737-vysledek-png  ]

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!

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

Děkuji zejména Warm_spiderovi.

Zdá se že funkční řešení pro MySQL vypadá následovně:

SELECT additional_name, min( additional_value ) , case when additional_value regexp '^[0-9]' 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ý den přeji !

Zpět do poradny Odpovědět na původní otázku Nahoru