Ergebnis 1 bis 2 von 2
  1. #1
    Avatar von TecEye
    TecEye ist offline König
    registriert
    28-01-2012
    Beiträge
    795

    mysql JOIN WHERE HAVING

    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

  2. #2
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.666

    AW: mysql JOIN WHERE HAVING

    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 - - -

    Zitat Zitat von tsseh Beitrag anzeigen
    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;

Ähnliche Themen

  1. MySQL Join?
    Von Junkee[] im Forum Serverseitige Programmierung
    Antworten: 3
    Letzter Beitrag: 11-12-2011, 17:53
  2. [MySql] Join
    Von slosd im Forum Serverseitige Programmierung
    Antworten: 2
    Letzter Beitrag: 13-04-2007, 23:01
  3. MySQL vs. MS-SQL (MySQL probl. mit JOIN?)
    Von Steini1980 im Forum Serverseitige Programmierung
    Antworten: 12
    Letzter Beitrag: 16-12-2005, 18:36
  4. mySQL-Anweisung join
    Von afoeder im Forum Serverseitige Programmierung
    Antworten: 1
    Letzter Beitrag: 01-07-2001, 16:39
  5. mysql => INNER JOIN
    Von laubi im Forum Serverseitige Programmierung
    Antworten: 5
    Letzter Beitrag: 19-12-2000, 19:12

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •