Ergebnis 1 bis 8 von 8

Thema: Komplexere Query (Subselect, Join, dynamische Spalte) in ORM wandeln

  1. #1
    Neuer Benutzer
    Registriert seit
    14.10.2011
    Beiträge
    13
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Frage Komplexere Query (Subselect, Join, dynamische Spalte) in ORM wandeln

    Hi Folks,

    ich habe eine etwas komplexere Query, welche per Subselect und Join ein Ranking erstellt. Das Query ansich läuft auch prima.. nur will ich das ganze jetzt auch noch sortieren und in den paginator laden.. tjaaaa und das geht dann ja doch besser, wenn man das alles über ORM macht.. das Query sieht wie folgt aus:
    Code:
    SELECT*FROM(SELECT  (SELECT    @rank := @rank+1) AS rank,QIN.*FROM(SELECT   REC.*,  COUNT(VOT.votes_recipes_id) AS vote_countsFROM   (SELECT    @rank := 0 AS rank) AS RINIT,   recipes REC  LEFT JOIN     votes VOT  ON    VOT.votes_recipes_id = REC.recipes_idWHERE   REC.recipes_status = 1GROUP BY  VOT.votes_recipes_idORDER BY  vote_counts DESC) AS QIN) AS QUER
    
    
    WHERErecipes_id = '". $iRecipesId ."'
    Das Where ist natürlich Optional, genuaso, wie der Status eigentlich auch noch gewählt werden kann.. aber das ist ja eher Peanuts. Jetzt hänge ich aber bei der Umsetzung zum ORM... als Beispiel habe ich aus der Dokumentation als Forlage natürlich das hier gefunden:

    PHP-Code:
    $select $db->select()             ->from(array('p' => 'products'),                    array('product_id'))             ->join(array('l' => 'line_items'),                    'p.product_id = l.product_id',                    array('line_items_per_product' => 'COUNT(*)'))             ->group('p.product_id')             ->order(array('line_items_per_product DESC',                           'product_id')); 
    Nur fehlen mir da 2 Dinge.. Subselects und solche Sachen wie '(SELECT @rank := 0 AS rank) AS RINIT'
    Bei Subselect habe ich schon gesehen, dann ich einfach über $db->query() mir eins erstellen.. bzw dann natürlich auch über select()... nur bleibt bei mir dort die Frage: klappt das auch im ORM, oder ist das nur allgemein, um querys zu erstellen.. das andere bereitet mir aber noch mehr Kopfzerbrechen.
    Für Infos (oder gar eine Lösung ) wäre ich sehr dankbar.

    So long

  2. #2
    Erfahrener Benutzer
    Registriert seit
    10.09.2007
    Ort
    Wuppertal
    Beiträge
    5.725
    Thanks
    1
    Thanked 39 Times in 39 Posts

    Standard

    Üblicherweise lässt man solch ein Ranking vorgenerieren, weil die Last meist zu groß ist, es on-the-fly zu erstellen. Dann wäre das Problem garnicht vorhanden
    Neues Projekt: zandman.de - Status: WIP




  3. #3
    Neuer Benutzer
    Registriert seit
    14.10.2011
    Beiträge
    13
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Kann man so oder so sehen.. das Problem ansonsten ist halt, dass ich eine Art Boublesort implementieren muss, wenn die Stimmenanzahl recht nah beieinander ist und ein Beitrag mehrere überspringt.. auch nicht unbedingt schön.. und selbst wenn.. würde es mir dann ums Prinzip gehen, wie man es macht muss ja irgendwie funktionieren (DB ist ja eben auch entsprechend so ausgelegt, dass es 'on-the-fly' passieren kann/soll/darf/muss)

  4. #4
    Erfahrener Benutzer
    Registriert seit
    10.09.2007
    Ort
    Wuppertal
    Beiträge
    5.725
    Thanks
    1
    Thanked 39 Times in 39 Posts

    Standard

    Irgendwie wurde der Link zur many-to-many relationship Abfrage bei Zend_Db_Table nicht mitgespeichert. Schau dazu mal bei Google oder im Referenzhandbuch nach.

    Wenn du mit DB etwas anderes als MySQL meinst, stimme ich dir da zu
    Neues Projekt: zandman.de - Status: WIP




  5. #5
    Neuer Benutzer
    Registriert seit
    14.10.2011
    Beiträge
    13
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Hmm Verstehe ich jetzt leider nicht ganz.. ich arbeite hier schon mit many-to-many, da ich bei den Beitrag auch noch Einzelelmente und die Benutzer ermitteln muss.. ist auch mit der Grund, warum ich das über ORM machen wollen würde - aber ich versteh' nicht ganz, wie es mir in diesem Fall helfen soll, da ich ja ein Count brauche (gut - da meine ich noch was drüber gelesen zu haben) und gleichzeitig eine neue Spalte erstelle, bei dem ich den Rank durchzähle.. und spätestens da hört es auf, bzw gibt es eben keine Beispiele im Referenzhandbuch.. oder ich überlese es dort immer.. dann wäre ich dankbar für die Nennung der genaureren Stelle...

  6. #6
    Erfahrener Benutzer
    Registriert seit
    10.09.2007
    Ort
    Wuppertal
    Beiträge
    5.725
    Thanks
    1
    Thanked 39 Times in 39 Posts

    Standard

    Das wird natürlich nicht abgedeckt, da das Referenz Handbuch nur die Basisfunktionalität und die benötigten 90% aller Fälle abdeckt.

    Ich hoffe dir ist auch klar, dass das ZF keine ORM Funktionalität implementiert hat oder dafür eine Komponente zur Verfügung stellt, weshalb es für mich auch schwierig ist zu verstehen, was du genau erreichen willst. Vielleicht erklärst du das erstmal und dann gibt es sicherlich eine einfach Lösung dazu.
    Neues Projekt: zandman.de - Status: WIP




  7. #7
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    4.503
    Thanks
    1
    Thanked 125 Times in 121 Posts

    Standard

    Einfach die Funktionen des Datenbankmanagementsystems nutzen: Sicht anlegen.
    Zum Zend Framework stehen jedem folgende fünf Quellen zum Nachschlagen zur Verfügung:

  8. #8
    Neuer Benutzer
    Registriert seit
    14.10.2011
    Beiträge
    13
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    So - jetzt musste ich es doch 'biegen', da das Projekt doch zu Zeitkritisch war und ich hier einen 'Scotty' hinlegen musste.. aber damit man auch eine befriedigendere Lösung bekommt, wollen wir das Thema nicht sterben lassen (Hasst Ihr es nicht auch, wenn man ein Problem hat, endlich einen Beitrag in einem Forum findet und dann das Gespräch stirbt, oder man einen Link bekommt, der auf einen toten Beitrag verweist....)

    @Dennis:

    Letztendlich wie oben beschrieben. Ein Select mit einigen SubSelects und Joins versehen und das dann das Ergebnis über die Objekte bezeihen und nicht per query(), da ich so ja das Ergebnis als Array und nicht als 'ObjektListe' bekomme.
    Genauer: Es geht hier um Objekte (wie man in der Query sehen kann Rezepte), die bewertet werden können. Ein Rezept ist natürlich als Model angelegt und kann so erzeugt werden blabla und so weiter - mehr noch, natürlich auch eine Liste. Diese Liste kann ich jetzt natürlich Lustig in einem View ausgeben (foreach). Das, was ich in der View habe ist ja eine 'Objektliste'. Wenn ich mir jetzt aber ein Ergebnis über 'query()' hole, bekomme ich es ja als Array(Liste) zurück.. d.h. die Zugriffe auf die einzelnen Attribute ändert sich. Das will ich eben nicht (müsste ja so 2 Views basteln; einmal für Objektliste, einmal für ArrayListe). Daher wäre es schön, wenn ich es über ORM holen könnte.. dafür muss ich aber besagte Query in der select()->where()->undsoweiter Schreibweise aufdröseln.. und da kam ich halt mit den ganzen Subselects (vor allem ' @rank := 0 AS rank' und ' @rank := @rank+1' nicht klar.. bei einem neu(erem) Framework (für mich) muss man sich da ja auch erst reinraffeln. - Hoffe jetzt ist es noch mal ein wenig klarer.

    @Kaiuwe: Stimmt.. 'ne View und das als neues Model anlegen.. wäre natürlich noch eine Möglichkeit - danke.. für's nächste Projekt

    Und wo wir eh beim Thema sind - ggf. die Frage auch direkt an Dennis: Wir waren ja oben bei der Sache, wo und wann man sowas machen kann/soll. Mein Ansatz schreibt ja auch nicht direkt etwas, es sind also nur Leserechte/zugriffe von nöten. Will man jetzt Deinen Ansatz verfolgen - also Berechnung beim 'Stimme vergeben', dann muss man ja das ganze in eine Transaktion packen (ansosten kann man ja Mist bauen, wenn rein zufällig n (n>1) Leute zeitgleich abstimmen). Jetzt habe ich Transaktionen über das Datenbankobjekt gefunden - nicht aber über die Modelle selbst - wahrscheinlich suche ich wieder einfach nach den falschen Wörtern - hätte dort jemand zufällig einen guten Link (der hoffentlich noch nicht tot ist ).

Ähnliche Themen

  1. Select query cannot join with another table
    Von herr_gumba im Forum DB
    Antworten: 10
    Letzter Beitrag: 21.02.2011, 15:59
  2. Antworten: 4
    Letzter Beitrag: 01.01.2010, 13:44
  3. Antworten: 16
    Letzter Beitrag: 20.10.2008, 17:52
  4. Datum in YYYY-mm-dd für MySQL-DB wandeln
    Von dhenninger im Forum Lokalisierung & Internationalisierung
    Antworten: 5
    Letzter Beitrag: 24.04.2008, 23:13
  5. Antworten: 2
    Letzter Beitrag: 08.06.2007, 14:10

Stichworte

Lesezeichen

Berechtigungen

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