selfmade01: Inner Join mit subselect und Limit?

Hallo

ich habe unten stehenden mysql-query

Ich habe in der motherplan 3 Datensätze mit der id 1,2,3 in der images habe ich 6 Datensätze wobei je zwei Datensätze die motherPlanId 1,2 oder 3 haben es sind also zwei Datensätze für jede ID vorhanden

in der information ist es genauso. Ich sortiere in den subselects das Datum und lasse mir dann nur einen Datensatz ausgeben Dabei tritt folgendes Problem auf ich erhalte zwar nur 3 Datensätze wie gewollt, jedoch nur einen Datensatz der image und information wobei ich auch 3 erhalten müsste da ja dort jede motherPlanId hinterlegt ist

Lasse ich Limit 1 weg so erhalte ich 6 Datensätze. Die Subselects habe ich einzeln gestets sie funktionieren was auch zeigt wenn ich Limit weglasse

irgend etwas passt da nicht

kann jemand helfen?

Grüße Jürgen


SELECT
	motherPlan.motherPlanId,motherPlan.motherPlanName,motherPlan.startBorn,
	motherPlan.endBorn,
	motherPlan.bornTypeId,motherPlan.active,motherPlan.motherPlanStars,
	bi.name,bi.breeder,
	bt.growType,
	im.imageId as imagesimageId, im.imageForm,im.imageTitle,
	inf.information, inf.informationTitle,inf.createDateTime, inf.changeDateTime
	FROM motherPlan
	LEFT JOIN  breederInfo AS bi ON bi.breederInfoId 		= motherPlan.breederInfoId		
	LEFT JOIN  bornType    AS bt ON motherPlan.bornTypeId  	= bt.bornTypeId	
	LEFT JOIN
	(SELECT imageId,imageCreateDate, imageForm,imageTitle,motherPlanId from images  ORDER BY imageCreateDate LIMIT 1) AS im
	ON motherPlan.motherPlanId         = im.motherPlanId												
	LEFT JOIN
	(SELECT information, informationTitle,  createDateTime , changeDateTime, motherPlanId from information ORDER BY createDateTime LIMIT 1) AS inf
	ON motherPlan.motherPlanId 	= inf.motherPlanId													
	ORDER BY 1 DESC LIMIT 0 , 10

  1. Tach!

    ich habe unten stehenden mysql-query

    Entgegen der Überschrift ist da aber kein Inner Join enthalten. Left (und Right) Joins sind Outer Joins.

    Ich habe in der motherplan 3 Datensätze mit der id 1,2,3 in der images habe ich 6 Datensätze wobei je zwei Datensätze die motherPlanId 1,2 oder 3 haben es sind also zwei Datensätze für jede ID vorhanden

    in der information ist es genauso. Ich sortiere in den subselects das Datum und lasse mir dann nur einen Datensatz ausgeben

    Dieser eine Datensatz hat eine von den drei motherPlanIds. Von den anderen beiden ist kein Datensatz in der Ergebnismenge. Da kann dann auch keiner mit den anderen Ergebnismengen gejoint werden. Jede im FROM (inkl. Joins) aufgeführte Datenmenge wird zunächst separat ermitteln, dann wird entsprechend der Bedingungen gejoint. Du müsstest also von den anderen beiden motherPlanIds auch jeweils einen Datensatz in der Subquery ermitteln. Allerdings hab ich grad keine Idee, wie man da vorgehen kann. GROUP BY auf die IDs mit dem MIN() vom Datum geht in MySQL, aber es ist nicht beeinflussbar, aus welchem der beiden Datensätze die Inhalte der anderen Felder in die Ergebnismenge genommen werden.

    dedlfix.

    1. Hall0,

      sorry erstmal für die falsche Überschrift. Aus meinem Frust heraus bin ich ganz durcheinander :(

      Dieser eine Datensatz hat eine von den drei motherPlanIds. Von den anderen beiden ist kein Datensatz in der Ergebnismenge. Da kann dann auch keiner mit den anderen Ergebnismengen gejoint werden.

      Bin mir jetzt nicht sicher ob ich das richtig erklärt habe da ich Deiner Erklärung nicht ganz folgen kann Deshalb hier kurz anhand eines Beispiels wie die Tabellen aussehen (ich schreibe nicht alle Felder, damit es etwas übersichtlicher wird)

      MotherPlan: motherPlanId      motherPlanName       startborn ------------ breederInfoId   bornType 1                 Testname             2014-08-01 20:30:00        1            1 2                 Testname2            2014-09-01 20:30:00        1            1 3                 Testname3            2014-10-01 20:30:00        2            1

      breederInfo: breederInfoId   breeder 1               Heinzmann 2               Neumann

      bornType: bornTypeId       bornyTpe 1                natural

      images: imageId      imageForm      imageTitle         motherPlanId    imageCreateDate 1             jpg            Geburt Tag 1        1             2014-10-01 20:30:00 2             jpg            Geburt Tag 3        1             2014-11-01 20:30:00 3             jpg            Geburt Tag 1        2             2014-10-11 20:31:00 4             jpg            Geburt Tag 5        2             2014-12-01 20:30:00 5             jpg            Geburt Tag 1        3             2015-01-01 03:30:00 6             jpg            Geburt Tag 2        3             2015-01-01 04:30:00

      information: informationId  information   informationTitle  createDateTime      motherPlanId 1              Testinfo 1     Testtitel 1      2014-10-01 20:30:00   1 2              Testinfo 1     Testtitel 1      2014-11-11 20:30:00   1 3              Testinfo 1     Testtitel 1      2014-09-01 20:33:00   2 4              Testinfo 1     Testtitel 1      2014-10-01 20:37:00   2 5              Testinfo 1     Testtitel 1      2014-12-01 20:30:00   3 6              Testinfo 1     Testtitel 1      2014-12-09 20:33:00   3

      Wie zu sehen ist, ist die Hauptabelle die motherPlan, davon benötige ich jeden Datensatz. In den beiden Tabellen breederInfo und borntype, kann es maximal nur einen zugehörigen Datensatz für die motherPlan geben oder eben keinen deswegen der normale Left Join damit alle Datensätze der motherplan auch ausgegeben werden. die anderen beiden tabellen images und informations können jedoch mehrere zugehörige Datensätze für die motherPlan haben oder auch keinen. Damit jedoch nur soviele Zeilen ausgegeben werden wie Datensätze in der Motherplan vorhanden sind, muss ich die Ergebnismenge aus images und information mit LIMIT 1 belegen. Damit ich das kontrollieren kann, sortiere ich die Datensätze aus images und information zuvor noch.

      Wurde es jetzt transparenter?

      das müsste doch mit Left-Joins gehenoder? Wenn nicht müsste es doch eine andere simple Möglichkeit geben

      Grüße Jürgen

      1. Tach!

        Dieser eine Datensatz hat eine von den drei motherPlanIds. Von den anderen beiden ist kein Datensatz in der Ergebnismenge. Da kann dann auch keiner mit den anderen Ergebnismengen gejoint werden. Bin mir jetzt nicht sicher ob ich das richtig erklärt habe da ich Deiner Erklärung nicht ganz folgen kann

        Doch, hast du richtig beschrieben. Ich hatte mir zwar erst gewünscht, solch eine Datensatzaufstellung zu bekommen, aber letztlich hab ich das Problem doch aus der Aufgabenstellung verstanden. Was du auch noch hättest machen können: Alles überflüssige weglassen. Spaltennamen, die keine verknüpfungsrelevanten Daten liefern und die beiden einfachen Joins sind solche Kandiaten. Im Zweifelsfall lass aber das drin, von dem du dir nicht sicher bist, ob es relevant sein könnte oder nicht. Das nur als nebensächlicher Hinweis. Nun zum Problem. Lies die folgende Beschreibung bitte erstmal ohne "eigenmächtig" Bezüge zu deinem Problem herzustellen. Das Gehirn fängt ja gern gleich damit an, die Antwort auf das Problem einzuordnen.

        Ein SQL-Datenbanksystem arbeitet mengenorientiert. Du hast eine oder mehrere vorläufige Ergebnismengen und die werden immer weiter eingeschränkt. Zu Anfang hast du eine große Menge Daten in der Datenbank. Dann kommst du mit einem FROM um die Ecke und das liefert erstmal die Menge aller Daten der angegebenen Tabelle. Auch die Joins liefern jeweils eine Tabelle oder im Falle der Subquerys jeweils eine bereits ausreichend eingeschränkte Menge. Das ist bei dir nicht der Fall, aber dazu später. Jetzt haben wir erstmal 5 Ergebnismengen. Nun kommen die Join-Bedingungen an die Reihe. Die Ergebnismengen werden entsprechend der Bedingung miteinander verknüpft. Aus breederInfo beispielsweise kommen zwei Datensätze in die zusammengeführte Menge, die restliche Menge fällt weg. Auf dieser Menge werden nun nacheinander die anderen Klauseln angewendet: WHERE, GROUP BY, SELECT, HAVING, ORDER BY, LIMIT. Das schränkt die Menge immer weiter ein oder macht etwa anderes mit ihr (zum Beispiel Sortieren).

        Deine Subquerys liefern völlig unabhängig von anderen Tabellen jeweils einen Datensatz, wegen des LIMIT 1. Auch sie durchlaufen die generelle Tippeltappeltour, das aber jeweils separat, weil sie im FROM/JOIN der äußeren Query stehen. Bei images hat der Datensatz mit der ID 1 das kleinste Datum. Das ist die Ergebnismenge, weil das LIMIT die einzige Einschränkung ist. Erst nachdem diese Menge entstanden ist, kommt das Joinen an die Reihe. Und das kann lediglich den einen Datensatz verknüpfen. Andere liegen nicht in der Menge. Dein Fehler ist, dass du annimmst, das auf irgendeine Weise die in motherPlan enthaltene Menge eine Rolle beim Auswählen der images-Datensätze spielt. Aber da ist überhaupt kein Bezug darauf in der Subquery. Es ist keine Correlated Subquery. Und zu der Zeit geht auch keine Korrelation zu den anderen Mengen herzustellen, weil das Joinen noch nicht stattgefunden hat. Korrelationen können erst im WHERE oder noch später, im SELECT hergestellt werden. (Das SELECT steht zwar als erstes in der Query, wird aber erst zwischen GROUP BY und HAVING ausgeführt. Ansonsten ist die Ausführungsreihenfolge gleich der (von der Syntax fest vorgegebenen) Anordnung der Klauseln.)

        Ich hoffe, dass du jetzt das Problem verstanden hast, und auch dass es sich auf diese Weise nicht lösen lässt.

        Wie zu sehen ist, ist die Hauptabelle die motherPlan, davon benötige ich jeden Datensatz. In den beiden Tabellen breederInfo und borntype, kann es maximal nur einen zugehörigen Datensatz für die motherPlan geben oder eben keinen deswegen der normale Left Join damit alle Datensätze der motherplan auch ausgegeben werden.

        Diese beiden Tabellen und Joins sind für das Problem nicht weiter relevant. Du kannst sie im Prinzip auch weglassen und erst dann wieder einfügen, wenn du die anderen beiden Verknüpfungsprobleme gelöst hast - oder eingesehen hast, dass das aus Prinzip so nicht lösbar ist.

        Wurde es jetzt transparenter?

        Nein ;) war schon transparent genug gewesen.

        das müsste doch mit Left-Joins gehenoder?

        Vermutlich nicht. Ich wüsste nicht wie. Mir ist bis jetzt auch keine andere Lösungsmöglichkeit mit nur einer Query eingefallen.

        Wenn nicht müsste es doch eine andere simple Möglichkeit geben

        Mithilfe der abfragenden Umgebung kannst du zu einer Lösung kommen. Du kannst die Subquerys aus der Query entfernen. Beim Durchlaufen über die Ergebnismenge der übriggebliebenen Query (motherPlan, breederinfo, bornType) feuerst du für jeden Datensatz je eine Query auf images und information ab. Da muss aber als Bedingung rein, die motherPlanId mit der übergebenen motherPlan-Id aus dem Durchlauf zu vergleichen. Das schränkt deren Ergebnismengen gemäß deinem Beispiel auf die zwei Datensätze passend zur motherPlan-Id ein, das LIMIT nach dem Sortieren lässt dann genau den einen gewünschten übrig. Das "Joinen" musst du dann an der Stelle in deinem Programm machen.

        Die Alternative dazu wäre, diesen beschriebenen Vorgang in einer Stored Procedure stattfinden zu lassen. Das wird aber anzunehmenderweise komplettes Neuland für dich sein und eine Menge Lernaufwand erfordern.

        dedlfix.

        1. Hallo,

          Mithilfe der abfragenden Umgebung kannst du zu einer Lösung kommen. Du kannst die Subquerys aus der Query entfernen. Beim Durchlaufen über die Ergebnismenge der übriggebliebenen Query (motherPlan, breederinfo, bornType) feuerst du für jeden Datensatz je eine Query auf images und information ab. Da muss aber als Bedingung rein, die motherPlanId mit der übergebenen motherPlan-Id aus dem Durchlauf zu vergleichen. Das schränkt deren Ergebnismengen gemäß deinem Beispiel auf die zwei Datensätze passend zur motherPlan-Id ein, das LIMIT nach dem Sortieren lässt dann genau den einen gewünschten übrig. Das "Joinen" musst du dann an der Stelle in deinem Programm machen.

          Die Alternative dazu wäre, diesen beschriebenen Vorgang in einer Stored Procedure stattfinden zu lassen. Das wird aber anzunehmenderweise komplettes Neuland für dich sein und eine Menge Lernaufwand erfordern.

          wow, ich hatte/habe da wohl einen totalen Denkfehler Noch wäre die Möglichkeit meine Tabellen und das Setzen der ID's anzupassen, weiss nicht ob das klüger wäre.

          Der Grund für diese Gestaltung der Tabellen war der, dass ich auf einer Webseite die motherplan mit Basis-Daten fülle und auf der anderen Webseite dann Zusatzinfos eintrage wie ich lade Bilkder hoch und trage Information ein. Damit die Tabelle motherplan nicht ewig im Datensatz und dessen felder lang wird , habe ich die Daten aufgeteilt da ich so die Möglichkeit habe die images-tabelle und die information-tabelle auch von anderen Webseiten also von anderen Tabellen zu nutzen die auch images und informations benötigen.

          Ich dachte der Ablauf eines Left Joins und eines Subselect's wäre so.

          Es wird alles ausgegeben was in der motherplan also der linken Tabelle steht. So beneötige ich das auch, auch wenn in den ge-jointen tabellen nichts steht. Die Tabellen die maximal nur eine Ergebnismenge pro motherplanId liefern können, left-joine ich mit einem simplen left-join da ich keine Sorge haben muss das auf einmal zuviele doppelte Datensätze mit gleicher id aus der motherplan auftauchen.

          da die images und die informations natürlich zu einem Datensatz aus der motherplan beliebig viele informationen und Bilder enthalten können würde ich mit einem normalen Left-Join zuviele Datensätze angezeigt bekommen,

          Ich dachte es läuft so

          1. zuerst wird mit dem Hauptselect alles gefunden was in der motherplan steht er findet den ersten Datensatz.
          2. nach dem er den ersten Datensatz der motherplan gefunden hat werden die beiden ersten Left-Joins abgearbeitet und bringen ihr Ergebnis dazu
          3. dann läuft er in den dritten Left-Join und kommt dort in eine schleife da ein subselect dort enthalten ist. Dieser subselect holt sich alle Datensätze und würde die auch ausgeben. nun werden diese Datensätze sortiert und danach limitiert . die Abfrage die im subslect enthalten ist vergelicht hierbei die aus dem Hauptselect der motherplan gefundene motherplan-id. in obigen Beispiel findet dieser subselect also 2 Datensätze und würde durch limit 1 nur einen ausgeben 4 ) mit dem letzten left-Join läuft es genauso wie mit dem unter 3)

          Ich stutze gerade deshalb, da wenn ich in den subselects die LIMIT Beschränkung weglasse, dann liefert er ja auch alle Datensätze. Das bedeutet doch das er dort auch alles findet. nur bringt er dann 2 Datensätze pro motherPlanId da ja je zwei Datensätze in der images und information enthalten sind. wieso ich dieses Ergebnis des Subselects  dann mit LIMIT nicht beschränken kann leuchtet mir nicht ein

          Grüße Jürgen

          Helf mir mal bitte mit welcher Möglichkeit ich das lösen könnte.

          Ich wollte eigentlich vermeiden das mit 2-3 verschieden qwuerys zu erschlagen die ich dann via php in einer Schleife vergleiche.

          Muss/sollte ich meine db-struktur anders aufbauen?

          1. Tach!

            ich hatte/habe da wohl einen totalen Denkfehler Noch wäre die Möglichkeit meine Tabellen und das Setzen der ID's anzupassen, weiss nicht ob das klüger wäre.

            Ich wüsste nicht, wie man das umstellen sollte. Du hast eine 1:n-Beziehung. Und davon möchtest du auf der n-Seite Gruppen bilden und jeweils einen Datensatz aus der Gruppe haben. Das ist ein generell nicht lösbares Problem im (Standard-)SQL-Umfeld. Jedenfalls nicht dann, wenn du Daten aus Feldern haben möchtest, die nicht im GROUP BY aufgeführt sind und auch nicht mit einer Aggregatfunktion zusammengefasst wurden. Angenommen, du möchtest das kleinste und größte Datum aus einem bestimmten Feld haben (SELECT MIN(feld), MAX(feld), andere_felder FROM ... GROUP BY ...), dann kommen diese Angaben aus zwei Datensätzen. Aus welchem der beiden Datensätze sollen nun die anderen Felder genommen werden? Und was genau spräche denn ganz allgemein gesehen, ohne eine spezielle Aufgabenstellung zu kennen (MySQL kann ja keine Gedanken lesen), dagegen, irgendeinen beliebigen anderen Datensatz aus der Gruppe abseits von MAX/MIN heranzuziehen? Eine solche Abfrage ist nicht eindeutig zu beantworten, weswegen die meisten SQL-Systeme solche Querys generell nicht erlauben. MySQL erlaubt es, gibt aber keine Garantie, welche Datensatz-Inhalte in der Ergebnismenge landen.

            Das ist das allgemeine GROUP-BY-Problem. GROUP BY wäre aber die einzige (mir einfallende) Möglichkeit, näher an die Lösung zu gelangen, nur um dann festzustellen, dass diese Straße eine Sackgasse ist.

            Es wäre nicht weiter schwer, eine Correlated Subquery zu erstellen. Doch die darf dann nur einen einzelnen Wert zurückliefern, weil sie nur im SELECT anstelle eines Feldes oder in einem WHERE anstelle eines Bedingungskriteriums notiert werden kann. Das ist für deinen Fall nicht anwendbar. Viele solcher Querys - für jedes Feld eine - wäre möglich, ist aber sehr unhandlich.

            Der Grund für diese Gestaltung der Tabellen war der, dass ich auf einer Webseite die motherplan mit Basis-Daten fülle und auf der anderen Webseite dann Zusatzinfos eintrage wie ich lade Bilkder hoch und trage Information ein. Damit die Tabelle motherplan nicht ewig im Datensatz und dessen felder lang wird , habe ich die Daten aufgeteilt da ich so die Möglichkeit habe die images-tabelle und die information-tabelle auch von anderen Webseiten also von anderen Tabellen zu nutzen die auch images und informations benötigen.

            Klassisches 1:n. Die Alternative wäre eine große Tabelle, in der der motherPlan-Anteil mehrfach enthalten wäre. Für jedes image ein Datensatz. Machbar aber sehr unschön. Zieht eine Menge andere Probleme nach sich, beispielsweise das, bei einer Änderung keine Abweichungen zwischen den redundanten Teilen der Datensätzen zu generieren. Das Ergebnis ist dann eine nicht normalisierte statt einer relationalen Datenhaltung.

            Ich dachte der Ablauf eines Left Joins und eines Subselect's wäre so. Es wird alles ausgegeben was in der motherplan also der linken Tabelle steht. [...] da die images und die informations natürlich zu einem Datensatz aus der motherplan beliebig viele informationen und Bilder enthalten können würde ich mit einem normalen Left-Join zuviele Datensätze angezeigt bekommen,

            Dir fehlt an der Stelle die Einschränkung "pro motherplanId". Die wird in der Subquery nicht berücksichtigt, weil sie gar nicht darin enthalten ist. Und wie schon gesagt, geht das generell nicht.

            1. dann läuft er in den dritten Left-Join und kommt dort in eine schleife da ein subselect dort enthalten ist. Dieser subselect holt sich alle Datensätze und würde die auch ausgeben. nun werden diese Datensätze sortiert und danach limitiert . die Abfrage die im subslect enthalten ist vergelicht hierbei die aus dem Hauptselect der motherplan gefundene motherplan-id. in obigen Beispiel findet dieser subselect also 2 Datensätze und würde durch limit 1 nur einen ausgeben

            Und genau das findet so nicht statt.

            Ich stutze gerade deshalb, da wenn ich in den subselects die LIMIT Beschränkung weglasse, dann liefert er ja auch alle Datensätze. Das bedeutet doch das er dort auch alles findet.

            Ja, die Ergebnismenge der Subquery besteht dann aus 6 statt einem Datensatz. Diese 6 werden anschließend mit der anderen bereits ermittelten Menge (aus motherplan und den beiden Joins) gejoint.

            nur bringt er dann 2 Datensätze pro motherPlanId da ja je zwei Datensätze in der images und information enthalten sind. wieso ich dieses Ergebnis des Subselects  dann mit LIMIT nicht beschränken kann leuchtet mir nicht ein

            Wegen der anderen Reihenfolge der Ausfühung der Zwischenergebnismengenermittlungen als in deiner Annahme.

            Helf mir mal bitte mit welcher Möglichkeit ich das lösen könnte.

            Die habe ich schon genannt.

            Ich wollte eigentlich vermeiden das mit 2-3 verschieden qwuerys zu erschlagen die ich dann via php in einer Schleife vergleiche.

            Auch eine Alternative dazu, die aber nicht minder aufwendig ist. Der Ort der Ausführung ist bei einer Stored Procedure nur ein anderer, die Vorgehensweise in dem Fall ist dieselbe wie unter PHP.

            Muss/sollte ich meine db-struktur anders aufbauen?

            Lieber nicht. Vom Regen in die Traufe wirds nicht besser.

            Die üblicherweise auf einer Webseite angezeigten Datenmengen belasten die Datenbank mit den zusätzlichen Abfragen nicht wirklich. Bleibt nur noch die Anzahl gleichzeitier Requests zu berücksichtigen. Die vermute ich aber in dem Fall als vernachlässigbar gering.

            dedlfix.

            1. Hallo,

              ich habe die Antwort wie ich das lösen könnte in einfachster Form zumindest so verstanden, dass ich mehrere Querys erstellen soll, da wenn ich Group by und dann selectiere es fraglich wäre ob ich das Problem so erschlagen könnte.

              Ich stutze gerade wirklich. Es wundert mich sehr das ein Datenbanksystem gleich so fix an seine Grenzen kommt. Ich vemite mal mein Problem was ich hier lösen möchte haben kommt doch recht häufig vor das man Daten aus mehreren tabellen joint und die Ergebnis-Mengen unterschiedlich sind die man dann filtern oder limitieren müsste.

              Mhhhh.. wahnsinn das dies so sehr schwer lösbar wäre in einem query zumindest

              Gut. dann meine Lösungsvorschlag mit Bitte an Dich die Logik mal anzusehen ob das funktioniert ich schreibe es einfach mal ganz banal auf, aber ich glaube Du wirst wissen was ich meine

              1) eregebnisarray_1 = select * from motherplan mit den beiden left-joins von breederinfo und borntype sowie den beiden left_joins mit den subselects; // wieso mit den subselects ?? ganz einfach, ich brauche die keys in den array-feldern, siehe weiter unten
              
              2) Schleife, laufe das ganze ergebnisarray_1 durch
                  {
                   eregbnisarray_2 = select * from images where eregebnisarray_1['motherplanId'] = motherplanid order by date (DESC oder ASC) LIMIT 1
                   if (erreagbinsarray_2 = ok){
                          eregebnisarray_1['imageTitle'] = erreagbinsarray_2['imageTitle']
                           usw.
                          .
                          .
                          }
                     eregbnisarray_3 = select * from information where eregebnisarray_1['motherplanId'] = motherplanid order by date (DESC oder ASC) LIMIT 1
                   if (erreagbinsarray_3 = ok){
                          eregebnisarray_1['imageTitle'] = erreagbinsarray_2['information']
                           usw.
                          .
                          .
                          }
                  }
              

              ich möchte also die erste db-abfrage mit den left-joins und auch mit den subselectsso lassen wie er ist damit ich die keys bekomme... auch wenn deren Werte dann leer sind. Dann setze ich einen select auf images und information ab mit der gerade in der schleife vorhandenen motherplanid , limitiere den Datensatz so dass nur einer als Ergbnis ausgegeben wird und fülle in dem eregbisarray_1 die Felder die teilweise leer sind aus images und information

              Ist so ok?

              Gute Lösung oder gibts was eleganteres?

              Grüße Jürgen

              1. Tach!

                ich habe die Antwort wie ich das lösen könnte in einfachster Form zumindest so verstanden, dass ich mehrere Querys erstellen soll, da wenn ich Group by und dann selectiere es fraglich wäre ob ich das Problem so erschlagen könnte.

                Ja, es ist eher unwahrscheinlich, auf alle Fälle unverlässlich, wenn du das mit Group By zu lösen versuchst. Es ist auch dann weiterhin unverlässlich, wenn in Tests genau die gewünschten Daten zu Tage gefördert werden.

                Ich stutze gerade wirklich. Es wundert mich sehr das ein Datenbanksystem gleich so fix an seine Grenzen kommt. Ich vemite mal mein Problem was ich hier lösen möchte haben kommt doch recht häufig vor das man Daten aus mehreren tabellen joint und die Ergebnis-Mengen unterschiedlich sind die man dann filtern oder limitieren müsste.

                An dem Prinzip sind schon viele vor dir hängengeblieben. Manchmal lässt sich eine für den jeweiligen Anwendungsfall andere brauchbare Lösung finden, manchmal nur eine umständlichere.

                1. eregebnisarray_1 = select * from motherplan mit den beiden left-joins von breederinfo und borntype sowie den beiden left_joins mit den subselects; // wieso mit den subselects ?? ganz einfach, ich brauche die keys in den array-feldern, siehe weiter unten

                Die Subquerys liefern keine brauchbare Datenmenge. 6 sind zu viel, 1 ist zu wenig. Ob der dann bei einem der drei motherplan-Datensätzen schon verjoint ist oder nicht, macht das Kraut nicht fett. Die 6 beeinflussen die Ergebnismenge ungünstig, der eine ändert nichts grundsätzliches an ihr. Du kannst die Subquerys hier bedenkenlos weglassen. (Die anderen beiden einfachen Joins bleiben aber.)

                1. Schleife, laufe das ganze ergebnisarray_1 durch

                Der Teil sieht prinzipiell gut aus.

                ich möchte also die erste db-abfrage mit den left-joins und auch mit den subselectsso lassen wie er ist damit ich die keys bekomme... auch wenn deren Werte dann leer sind.

                Welche Keys eigentlich genau? Die motherplan-IDs sind ja schon in eregebnisarray_1 enthalten, auch ohne die Subquerys. Den Key des einen Subquery-Datensatzes brauchst du auch nicht mehr, denn den bekommst du ja im Zuge der Schleife sowieso in erreagbinsarray_2 geliefert.

                Ist so ok?

                Von meiner Seite her ja (inklusive Anmerkungen zu den Subquerys).

                Gute Lösung oder gibts was eleganteres?

                Zumindest zielführend ist sie und was anderes außer Stored Procedure ist mir auch nicht weiter eingefallen.

                dedlfix.

                1. Hallo,

                  meine Überlegung weshalb ich den ungünstigen query mit den Left-Joins incl. der subselects stehen lassen wollte, sogar das mit den Limits ist folgender.

                  Ich bin nicht so der perfekte Programmierer und müsste erst umständlich suchen wie ich ein array erweitern kann. Grund: ich benötige ein einziges array mit den Daten für meine jqgrid-table (jquery-plugin zum tabellen erstellen)

                  Wenn ich jetzt den ungünstigen query mit den subselects so lasse, so habe ich zumindest die daten sicher die ich fürs erste benötige , also alle Daten aus der motherPlan, aus breederInfo und aus bornType. Weiter habe ich in dem $row ( aus $result = $mysqli->query("SELECT .....) und $row = mysqli_fetch_array($result_1,MYSQLI_ASSOC)) auch die nicht korrekten felder stehen auch wenn sie leer oder falsch sind, ich habe zumindest schonmal ein fertiges assoziatives array

                  Beim anschliessenden schleifendurchlauf bei denen die Tabellen images und informations abgefragt werden muss ich nur noch dieses array also $row['imageTitle'] = $newrow['imageTitle']; füllen

                  Wenn ich nur die ersten beiden left-joins mit einbeziehe, so müsste ich später das array erweitern wohl mit $row[$datenfeldname_aus_information_oder_images] = $value;

                  Das würde aus meiner Sicht nur dann nicht gehen, wenn es tatsächlich passieren könnte das die alle Daten falsch wären also die Daten aus der linken Tabelle und die Daten aus den beiden ersten normalen Left-Joins.... alle anderen Daten die aus informations und images stammen werden später bei dieser Methode eh überschrieben

                  Grüße Jürgen

                  1. hallo,

                    ich habe das jetzt mal so probiert... mit den wenigen Datensätzen die ich habe, funktioniert das einwandfrei. Jetzt bekomme ich genau das was ich wollte

                    Wenn das aber aktuell eine Täuschung ist, dann schreib nochmal kurz bitte, dann werde ich es so machen wie Du angeraten hattest

                    Grüße Jürgen

                    ps. das mit den Left-joins und meinem Versuch, ist schon wirklich einen täuschende Gefahr der man sich da hingibt, aus meiner Sicht ist es immer noch nicht ganz logisch wieso das man nicht in ein Datenbanksystem so integrieren kann das es auch funktioniert

                    Aber vielleicht geht das nur bei Oracle & Co

                  2. Tach!

                    Grund: ich benötige ein einziges array mit den Daten für meine jqgrid-table (jquery-plugin zum tabellen erstellen) Wenn ich jetzt den ungünstigen query mit den subselects so lasse, so habe ich zumindest die daten sicher die ich fürs erste benötige , also alle Daten aus der motherPlan, aus breederInfo und aus bornType. Weiter habe ich in dem $row ( aus $result = $mysqli->query("SELECT .....) und $row = mysqli_fetch_array($result_1,MYSQLI_ASSOC)) auch die nicht korrekten felder stehen auch wenn sie leer oder falsch sind, ich habe zumindest schonmal ein fertiges assoziatives array

                    Du greifst einfach schreibend auf die hinzuzufügenden Felder zu und tust so, als ob sie vorhanden sind. Dabei entstehen sie so, als wenn sie gleich bei der ersten Query mitgeneriert worden wären. Da du ja keinen Eintrag aus dem bereits vorhandenen halbfertigen Array auslässt, entstehen auch nicht mal volle und mal halbe Einträge. Du musst lediglich darauf achten, auf dem originalen Array zu arbeiten und nicht nur eine Kopie der Einträge des ersten Arrays zu beschreiben. Aber das musst du auch beachten, wenn du die durch die überflüssigen Subquerys bereits vorhandenen Einträge ändern willst.

                    Beim anschliessenden schleifendurchlauf bei denen die Tabellen images und informations abgefragt werden muss ich nur noch dieses array also $row['imageTitle'] = $newrow['imageTitle']; füllen

                    Kein Unterschied zu nicht vorhandenen Feldern.

                    Wenn ich nur die ersten beiden left-joins mit einbeziehe, so müsste ich später das array erweitern wohl mit $row[$datenfeldname_aus_information_oder_images] = $value;

                    Das kommt aufs selbe raus, ob du das Feld mit einem Variableninhalt ansprichst oder einem String-Literal.

                    Das würde aus meiner Sicht nur dann nicht gehen, wenn es tatsächlich passieren könnte das die alle Daten falsch wären also die Daten aus der linken Tabelle und die Daten aus den beiden ersten normalen Left-Joins.... alle anderen Daten die aus informations und images stammen werden später bei dieser Methode eh überschrieben

                    Es gäbe nur dann ein Problem, wenn die Querys 2 und 3 keine Daten zur motherPlanId finden. In dem Fall musst du die zusätzlichen Feldeinträge mit einem Stringliteral ansprechen oder du nimmst die Liste der Felder aus den Metadaten zum Request, anstatt die Namen aus den Datensatz-Keys selbst zu nehmen.

                    dedlfix.