• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

mysql JOIN WHERE HAVING

TecEye

New member
Hy Leute,
ich hab eine Liste mit Positionen, aus dem aktuellen und aus dem vorquartal. Gefiltert soll ZB nach "nur neue" heißt der vorquartalswert pre_value muss 0 sein. da dies ein berechnetes Feld ist kommt hier HAVING zum Einsatz, allerdings kommt nicht raus soll, entferne ich aber die WHERE Clause dann kommen die werte, allerdings auch die ungruppierten vorquartalswerte logischerweise, ich schätze also es hängt mit dem JOIN zusammen welches ich vorher eingebaut habe. Aber jetzt komm ich nicht mehr weiter...
Filter Script:
Code:
// FastFilter
$fastfilter		= explode(",",$fastfilter);
$having_ff		= [];
if($fastfilter[0] == 1){ $having_ff[] = "((f.form_y = '".$cur_year."' AND f.form_q = '".$cur_qtr."') OR (f.form_y = '".$pre_year."' AND f.form_q = '".$pre_qtr."'))";}
if($fastfilter[1] == 1){ $having_ff[] = "(f.form_y = '".$cur_year."' AND f.form_q = '".$cur_qtr."' AND pre_value = 0)";}
if($fastfilter[2] == 1){ $having_ff[] = "(f.form_y = '".$pre_year."' AND f.form_q = '".$pre_qtr."')";}
if($fastfilter[3] == 1){ $having_ff[] = "(value_mod > pre_value AND pre_value > 0)";}
if($fastfilter[4] == 1){ $having_ff[] = "(((f.form_y = '".$cur_year."' AND f.form_q = '".$cur_qtr."') OR (f.form_y = '".$pre_year."' AND f.form_q = '".$pre_qtr."')) AND f.value_mod < pre_value)";}
if($fastfilter[5] == 1){ $having_ff[] = "((f.form_y = '".$cur_year."' AND f.form_q = '".$cur_qtr."') AND sshPrnamt_mod = pre_sshPrnamt)";}
$having_ff		= implode(" OR ", $having_ff);

Query:
Code:
SELECT f.*,
		IF(f.form_y = '".$pre_year."' AND f.form_q = '".$pre_qtr."', 0 , f.value) AS value_mod, 
		IF(f.form_y = '".$pre_year."' AND f.form_q = '".$pre_qtr."', 0 , f.sshPrnamt) AS sshPrnamt_mod, 
		IF(f.form_y = '".$pre_year."' AND f.form_q = '".$pre_qtr."', 0 , ((100 / ".$sum_value.") * f.value)) AS weight, 
		@pre_sshPrnamt := (SELECT ED0.sshPrnamt FROM sys_filings ED0 WHERE ED0.form_y = '".$pre_year."' AND ED0.form_q = '".$pre_qtr."' AND ED0.connector='".$code."' AND ED0.cusip = f.cusip), 
		@pre_sshPrnamt := IFNULL(@pre_sshPrnamt, 0) AS pre_sshPrnamt, 
		@pre_value := (SELECT ED1.value FROM sys_filings ED1 WHERE ED1.form_y = '".$pre_year."' AND ED1.form_q = '".$pre_qtr."' AND ED1.connector='".$code."' AND ED1.cusip = f.cusip), 
		@pre_value := IFNULL(@pre_value, 0) AS `pre_value`, 
		IF(@pre_value = f.value OR @pre_value = 0, 
			IF(@pre_value = 0, 100, 0),
			IF(@pre_value< f.value, 
				(100 - ((100 / f.value) * @pre_value)), 
				0 - (100 - ((100 / @pre_value) * f.value))
			)
		) AS changes 
	FROM sys_filings f 
	LEFT JOIN sys_filings f2 
	ON (f.cusip = f2.cusip AND f.connector = f2.connector AND CONCAT(f.form_y,f.form_y) < CONCAT(f2.form_y,f2.form_y))
	WHERE f2.form_y IS NULL AND f.connector LIKE '".$code."' AND f.sshPrnamtType='SH' 
	HAVING ".$having_ff." ORDER BY ".$sort." ".$order." LIMIT ".$position.", ".$limiter

Bin für jeden Tipp dankbar
 
kannst du das nicht so posten, dass man auch was sieht?
keine ahnung was $having_ff ist.
also ganz allgemein: HAVING arbeitet auf der ergebnisstabelle, eigentlich ist es sogar nur auf feldern der GROUP BY clausel anwendbar, MySQL erlaubt es aber auch auf anderen spalten der ergebnisstabelle.

- - - Aktualisiert - - -

kannst du das nicht so posten, dass man auch was sieht?
bau das mal so aus, dass erkennbar wird was du möchtest:
Code:
DROP TABLE xxx;
DROP TABLE yyy;

CREATE TABLE xxx  (connector INT, value INT);
CREATE TABLE yyy  (connector INT, pre_value INT);

INSERT INTO xxx VALUES (1, 1);
INSERT INTO xxx VALUES (2, 2);
INSERT INTO xxx VALUES (3, 3);
INSERT INTO xxx VALUES (4, 4);
INSERT INTO xxx VALUES (5, 5);
INSERT INTO yyy VALUES (1, 0);
INSERT INTO yyy VALUES (2, 1);
INSERT INTO yyy VALUES (3, 0);
INSERT INTO yyy VALUES (4, 1);
INSERT INTO yyy VALUES (5, 0);

SELECT value, pre_value FROM xxx LEFT JOIN yyy ON xxx.connector = yyy.connector WHERE yyy.connector < 4 HAVING pre_value = 0;
 
Zurück
Oben