turk porno porno escort rokettube
Ergebnis 1 bis 7 von 7

Thema: JOIN mit mehreren ON-Klauseln

  1. #1
    Neuer Benutzer
    Registriert seit
    19.09.2014
    Beiträge
    29
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard JOIN mit mehreren ON-Klauseln

    Hallo Community,
    ich arbeite derzeit daran, meine SQL's mittels Zend\Db\Sql abzubilden.
    Bei einfachen Insert/Update/Delete-SQL's funktioniert das soweit auch tadellos.
    Allerdings möchte ich nun eine Abfrage auf eine Satzartentabelle machen. Bei dieser Abfrage möchte ich 2 Informationen aus der selben Satzarten-Tabelle miteinander koppeln. (Der Aufbau der DB ist vorgegeben, daher bitte keine Diskussion das ihr die Tabellen evtl anders aufbauen würdet)

    Das SQL, dass ich abbilden möchte, sieht folgendermaßen aus:
    Code:
    SELECT SUBSTR(a.info,0,24) as NAME, b.info as MAIL, a.key as NR
    FROM SCHEMA.TBL a
    LEFT OUTER JOIN SCHEMA.TBL b
    ON a.KEY = b.KEY
    AND a.ID = b.ID
    AND b.ART='002'
    WHERE a.AKTIV='1' AND a.ID='001' AND a.ART='100' 
    ORDER BY a.INFO
    Ich habe nun versucht dieses SQL mittels Zend\Db\Sql abzubilden:
    PHP-Code:
    $select = new Select();
    $select->from(array('a' => $this->tableGateway->getTable()));
    $select->columns(array('NAME' => new Expression('SUBSTR(a.info, 0, 24)'),
        
    'NR' => 'KEY',
    ));
    $on "a.KEY = b.KEY AND a.ID = b.ID AND b.ART=002";
    $select->join(array('b' => $this->tableGateway->getTable()), 
    $on, array('MAIL' => 'info'), Select::JOIN_LEFT);
    $where = new Where();
    $where->equalTo('a.AKTIV''1')
         ->
    and->equalTo('a.ID''001')
         ->
    and->equalTo('a.ART','100')
    $select->where($where);        
    $select->order('a.INFO ASC');
    echo 
    $select->getSqlString($this->tableGateway->getAdapter()->getPlatform());
    $results $this->tableGateway->selectWith($select); 
    Als SQL kann ich mir dann an der stelle:
    PHP-Code:
    echo $select->getSqlString($this->tableGateway->getAdapter()->getPlatform()); 
    folgendes ausgeben lassen:
    Code:
    SELECT SUBSTR(a.info, 0, 24) AS "NAME", 
        "a"."KEY" AS "NR", 
        "b"."INFO" AS "MAIL" 
    FROM "SCHEMA"."TBL" AS "a" 
    LEFT JOIN "SCHEMA"."TBL" AS "b" 
    ON "a"."KEY" = "b"."KEY" AND "a"."ID" = "b"."ID" AND "b"."ART"="002" 
    WHERE "a"."AKTIV" = '1' 
        AND "a"."ID" = '001' 
        AND "a"."ART" = '100' 
    ORDER BY "a"."INFO" ASC
    was ja mal, bis auf die Anführungszeichen ziemlich richtig aussieht.
    Als Fehlermeldung bekomme ich jedoch
    Statement Prepare Failed

    Kann mir jemand sagen, was ich falsch mache?
    Danke

  2. #2
    Benutzer
    Registriert seit
    22.06.2008
    Beiträge
    84
    Thanks
    1
    Thanked 6 Times in 6 Posts

    Standard

    Um welche Datenbank handelt es sich denn? Funktioniert die Query, wenn Du sie in der Konsole oder einem anderen Abfragetool ausführst?

  3. #3
    Neuer Benutzer
    Registriert seit
    19.09.2014
    Beiträge
    29
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Es handelt sich um eine Db2-Datenbank.

    Ich habe nun mal eine funktionierende Zend\Sql-Anweisung genommen und Schritt für Schritt auf das vorhandene Scenario umgebaut.
    Das hat mir nun auch schon viel geholfen (Keine Ahnung, warum ich nicht gestern schon auf die Idee gekommen bin ^.^)
    Zum einen ist die Db2-Datenbank case-sensitive. In meinem Beispiel hatte ich zwar alles groß geschrieben, in meiner Anwendung gabs aber ein Feld, welches ich versehentlich klein geschrieben habe.
    Zum anderen musste ich bei den Expressions den Alias auch in Anführungszeichen setzen.
    Also bspw. statt:
    PHP-Code:
    new Expression('SUBSTR(a.INFO, 0, 24)'
    eben
    PHP-Code:
    new Expression('SUBSTR("a".INFO, 0, 24)'
    Jetzt habe ich nur noch ein Problem in der On-Klausel.
    Und zwar habe ich hier einen festen Wert drin.
    PHP-Code:
    $on "a.KEY = b.KEY AND a.ID = b.ID AND b.ART=002"
    002 ist hierbei ein String.
    Bei dieser on-Abfrage erzeugt er: ....
    AND "b"."ART" = "002"
    Und dann bekomme ich die Meldung das die Spalte "002" nicht gefunden wurde
    Versuche ich:
    PHP-Code:
    $on "a.KEY = b.KEY AND a.ID = b.ID AND b.ART='002'"
    erzeugt er:
    AND "b"."ART" = "'""002"'""
    was er dann auch nicht interpretieren kann.

    Auch:
    PHP-Code:
    $on "a.KEY = b.KEY AND a.ID = b.ID AND b.ART=\'002\'"

    bringt leider nichts.

    Jemand eine Idee, wie ich die On-Abfrage richtig machen kann?

  4. #4
    Neuer Benutzer
    Registriert seit
    19.09.2014
    Beiträge
    29
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    So, ich komme der Sache immer näher.
    Durch:
    PHP-Code:
    $on = new Expression("b".ART = \'002\''); //Abgekürzt 
    bekomme ich nun ein SQL, welches sich zumindest auf der DB direkt ausführen lässt.

    Das SQL wird auch allem Anschein nach in PHP ausgeführt.
    Wenn ich dann aber mittels einer foreach-Schleife über das ResultSet gehen möchte, bekomme ich folgende Fehlermeldung:
    This result is a forward only result set, calling rewind() after moving forward is not supported
    EDIT:
    Ok, der Fehler kommt erst, wenn ich ein zweites mal über das ResultSet mit foreach gehen möchte.
    Geändert von isac91 (07.01.2015 um 15:56 Uhr)

  5. #5
    Neuer Benutzer
    Registriert seit
    19.09.2014
    Beiträge
    29
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Okay
    ENDLICH!!!
    Die Lösung ist:
    PHP-Code:
    //...
    $results $this->tableGateway->selectWith($select);
    return 
    $results->buffer(); 
    Wenn ich es richtig verstehe, läd er sich durch buffer() die Daten in den Zwischenspeicher und ich kann so oft drüber laufen, wie ich möchte.
    Wenn ich aber nur $results zurück gebe, ließt er die Werte nur einmal und wirft sie dann aus dem Zwischenspeicher, sodass ich kein zweites mal drüber laufen kann.
    Verstehe ich das richtig? Kann mir das jemand bestätigen :-D

    die Lösung gefunden habe ich hier php - This result is a forward only result set, calling rewind() after moving forward is not supported - Zend - Stack Overflow

  6. #6
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von isac91 Beitrag anzeigen
    Wenn ich es richtig verstehe, läd er sich durch buffer() die Daten in den Zwischenspeicher und ich kann so oft drüber laufen, wie ich möchte.
    Steht zumindest im Quellcode.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  7. The Following User Says Thank You to Kaiuwe For This Useful Post:

    isac91 (08.01.2015)

  8. #7
    Neuer Benutzer
    Registriert seit
    19.09.2014
    Beiträge
    29
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Zitat Zitat von Kaiuwe Beitrag anzeigen
    Steht zumindest im Quellcode.

    Auf die Idee im Quellcode nachzuschauen, hätte ich auch selbst kommen können.
    Dann hab ich es ja aber auch richtig verstanden.

    Dankeschön

Ähnliche Themen

  1. View mit mehreren Formularen
    Von Stephan123 im Forum Einsteigerfragen
    Antworten: 5
    Letzter Beitrag: 11.07.2012, 13:57
  2. Zend_Application_Resource_View mit mehreren basePaths
    Von sumsa im Forum Installation & Konfiguration
    Antworten: 13
    Letzter Beitrag: 18.03.2010, 14:31
  3. Antworten: 4
    Letzter Beitrag: 01.01.2010, 15:44
  4. Zend_Controller_Router_Route mit mehreren Parametern
    Von Zendy im Forum Einsteigerfragen
    Antworten: 4
    Letzter Beitrag: 02.04.2009, 23:16
  5. Antworten: 8
    Letzter Beitrag: 12.09.2008, 01:38

Lesezeichen

Berechtigungen

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