Array filtern

DrBonsai

Mitglied
Hallo,
ich stecke mal wieder fest:
Ich habe folgendes Problem:
Ich suche mir aus einer MySql DB ein paar Einträge raus (Inversoren), mit folgendem Code:
PHP:
<?php 
		$inversores = "SELECT `designacaoproduto`
FROM `comprodutos`
WHERE `idprodutosubtipo`
IN (

SELECT `idprodutosubtipo`
FROM `comprodutossubtipos`
WHERE `idprodutotipo` =35
)
AND `activo` = -1
AND (
`idproduto`
IN (

SELECT `idproduto`
FROM `comprodutoscaracteristicasatribuicoes`
WHERE `idcaracteristica` =283
OR `idcaracteristica` =304
OR `idcaracteristica` =313
OR `idcaracteristica` =338
OR `idcaracteristica` =357
)
)
ORDER BY `designacaoproduto` ASC ";
		$query_inversores=mysql_query($inversores);
			while($inversores_array=mysql_fetch_row($query_inversores))
				{
				echo("<option>".$inversores_array[0]."</option>\n"); 
				}
		?>

Soweit, so gut.
Meine Ausgabe enthält aber noch zu viele Elemente.
Jetzt muss ich erstmal für jedes Element des Arrays die Werte
PHP:
$u_min, u_max,  $potential
rausfinden, die aber nicht in der Tabelle `comprodutos` stehen
Weitere Variablen habe ich schon festgelegt:
PHP:
$u_min_aero, u_max_aero,  $potential_nominal, $quantity_generator

Das Ausgabe-Array soll dann nur noch die Werte enthalten, für die gitl:
PHP:
ceil($u_min / $u_min_aero) <= floor ($u_max / $u_max_aero and
ceil($u_min / $u_min_aero) <= $quantity_generator / (ceil(potential_nominal / $potential)) and
$potential_nominal / (ceil($potential_nominal / $potential)) <= $potential

So wie ich das sehe, kann ich nich direkt in der Datenbakn filtern, weil ich da mit den Werten nicht rumrechnen kann, oder irre ich mich da?
Deswegen muss ich also erstmal ein Array aus der DB holen, das nochmal durchfiltern, in einem weiteren Array speichern und die Elemente dann ausgeben.

Ich habe nur leider einfach keinen blassen Schimmer, wie ich das anstellen soll.

Vllt. hilft es mir schon, wenn mir erstmal jemand das Brett vorm Kopf wegnimmt, wie ich ein Array erstelle, dass für jedes Element von $inversor_array die Werte u_min, u_max, $potental enthält und `designacaoproduto` aus meiner Datenbanktabelle `comprodutos`.

mfg,
David
 
So wie ich das sehe, kann ich nich direkt in der Datenbakn filtern, weil ich da mit den Werten nicht rumrechnen kann, oder irre ich mich da?

Ja, da irrst du dich. MySQL kann sehr wohl rechnen. Und runden geht entwender mittels Präzsionsrundung oder wie du es in deinem PHP-Code schon angewendet hast, mittels ab- oder aufrunden (CEIL und FLOOR).

Mal davon abgesehen, dass ich kaum was von dem verstanden habe, was du machen willst. Italienisch ist nicht so mein Dingen ;-)

Desweiteren empfehle ich der Übersichtlichkeit willen: Verwende JOINS.
 
Ja, da irrst du dich.

Freut mich zu hören.

Hat bis jetzt gedauert. Aber ich habs gebaut gekriegt.
Wahrscheinlich nicht die optmale Lösung, aber mehr verstehe ich von MySQL bislang noch nicht.

So siehts insgesamt aus:

PHP:
<tr>
	<td colspan="2">
		<select name="inversor" size="1" style="width: 350px" >
		<?php 
		require_once '../funcoes/eolica/u_generator.php';
		require_once '../funcoes/eolica/quantity_generator.php';
		require_once '../funcoes/eolica/potential_nominal.php';
		$inversores = "SELECT *
FROM `comprodutos`
WHERE `idprodutosubtipo`
/*Escolha todos os subtipo, que pertencem ao tipo 35*/
IN (

SELECT `idprodutosubtipo`
FROM `comprodutossubtipos`
WHERE `idprodutotipo` =35
)
/*Escolha produtos activos*/
AND `activo` = -1
/*Escolha produtos onde: Tensao mínimo da entrada do inversor divido com a tensao mínima do aerogerador, arredondado ao excesso */
/*<= tensao máxima do inversor divido com a tensao máxima do aerogerador, arredondado ao defeito */
AND `idproduto` = (
SELECT IF( CEIL( (

SELECT SUBSTRING_INDEX (
(SELECT `valor` FROM `comprodutoscaracteristicasatribuicoes` WHERE `idcaracteristica`= 357 AND `idproduto` = comprodutos.`idproduto`), 
'-', 1)
) / '$u_min_generator_string' ) <= FLOOR( (

SELECT SUBSTRING_INDEX (
(SELECT `valor` FROM `comprodutoscaracteristicasatribuicoes` WHERE `idcaracteristica`= 357 AND `idproduto` = comprodutos.`idproduto`), 
'-', -1)
) / '$u_max_generator_string' ) , `idproduto` , NULL ) )


/*Escolha produtos onde: Tensao mínima do incersor divido com a tensao mínima do aerogerador, arredondado ao excesso*/
/*<= Quantidade de aerogeradores divido com a potencia nominal do sistema, divido com a potencia dos inversores, arredondado ao excesso */
AND `idproduto` = (
SELECT IF( CEIL( (

SELECT SUBSTRING_INDEX ((SELECT `valor` FROM `comprodutoscaracteristicasatribuicoes` WHERE `idcaracteristica`= 357  AND `idproduto` = comprodutos.`idproduto`), 

'-', 1)

) / '$u_min_generator_string' ) <= ( '$quantity_generator_string' / CEIL( '$potential_nominal_string'/ ((

SELECT `valor`
FROM `comprodutoscaracteristicasatribuicoes`
WHERE `idproduto` =comprodutos.`idproduto`
AND `idcaracteristica` =159
)/1000 ) ) ) , `idproduto` , NULL ) )

/*Escolha produtos onde: Potencia nominal instalada, divido com a potência nominal instalada divido com a potência do inversor, arredondado ao excesso*/
/*<= Potencia do inversor*/
AND `idproduto` = (SELECT IF ('$potential_nominal_string' / CEIL( '$potential_nominal_string' /((
SELECT `valor`
FROM `comprodutoscaracteristicasatribuicoes`
WHERE `idproduto` =comprodutos.`idproduto`
AND `idcaracteristica` =159
)/1000 ))<=
((SELECT `valor`
FROM `comprodutoscaracteristicasatribuicoes`
WHERE `idproduto` =comprodutos.`idproduto`
AND `idcaracteristica` =159)/1000 ),
comprodutos.`idproduto`,NULL))
/*Ordena resultados ascendente*/
ORDER BY `designacaoproduto`ASC";
		$query_inversores=mysql_query($inversores);
			while($inversores_array=mysql_fetch_assoc($query_inversores))
				{
				echo("<option>".$inversores_array['designacaoproduto']."</option>\n"); 
				}
		?>
		</select>
	</td>
</tr>

Es geht weiter....
 
Der Code sieht schlecht wartbar aus. Vielleicht kannst du die Strings etwas aufteilen. Achja und sorry, es scheint spanisch zu sein ;-)
 
Zurück