Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL query in Foreach-Loop vermeiden.

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • SQL query in Foreach-Loop vermeiden.

    Guten Tag, ich habe mir für meine Webseite eine Key-Value Datenbank erstellt um damit ein bisschen zu Arbeiten.
    Das Problem was ich nun habe ist folgendes, hier erstmal ein kleiner Einblick in die Datenbank

    1.png

    in der Tabelle 2 sind alle Daten für den jeweiligen Primary Schlüssel aus Tabelle 1
    Ich möchte folgendes auf einer PHP Seite ausgeben:

    2.png

    Kurz zur Erklärung das LIMIT 5 kommt von der Pagination das bedeutet ich will pro Seite 5 Objekte aus Tabelle 1 darstellen, leider gelingt es mir nur durch einen SQL Query in der foreach Loop das Ergebnis zu bekommen welches ich möchte in Worten soll das wie Folgt aussehen:

    die unterstrichenen Wörter sind hier die VALUES von Tabelle 2

    APP mit der id = 2 hat den name und die version von dev_name als lang
    APP mit der id = 3 hat den name und die version von dev_name als lang
    APP mit der id = 5 hat den name und die version von dev_name als lang
    APP mit der id = 7 hat den name und die version von dev_name als lang
    APP mit der id = 9 hat den name und die version von dev_name als lang

    Ich möchte also aus den beiden Tabellen ein Array erstellen welches ich wie folgt an die Foreach schleife übergeben kann um das gleiche Ergebnis zu bekommen:

    3.png

  • #2
    Es wäre nicht schlecht, wenn Du ein SQLfiddle baust....http://sqlfiddle.com/

    Kommentar


    • #3
      Du kannst hier zumindest das erste Statement als Subquery verwenden.
      [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

      Kommentar


      • #4
        Bitte keine Screenshots hier posten, sondern den Quelltext direkt per Copy & Paste mit den CODE bzw. PHP Tags. Danke!

        MOD: Verschoben von PHP-Fortgeschritten
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          Code:
          SELECT daten.*
          FROM Objekte
          
          LEFT JOIN
          (
              SELECT
              object_id,
              MAX(CASE Daten.`key` WHEN 'version' THEN value ELSE '' END) AS version,
              MAX(CASE Daten.`key` WHEN 'name' THEN value ELSE '' END) AS name,
              MAX(CASE Daten.`key` WHEN 'dev_name' THEN value ELSE '' END) AS dev_name,
              MAX(CASE Daten.`key` WHEN 'lang' THEN value ELSE '' END) AS lang
              FROM Daten
              GROUP BY object_id
          ) AS daten ON daten.object_id = Objekte.id
          
          WHERE Objekte.type = 'app'
          object_id version name dev_name lang
          1 Test
          2 3 TestApp tesrtfdsg de
          Wenn die Keys nicht fest in der Abfrage definiert sein sollen kannst du auch eine SQL-Funktion schreiben die dir so eine Abfrage zusammenbaut.

          APP mit der id = 2 hat den name und die version von dev_name als lang
          APP mit der id = 3 hat den name und die version von dev_name als lang
          APP mit der id = 5 hat den name und die version von dev_name als lang
          APP mit der id = 7 hat den name und die version von dev_name als lang
          APP mit der id = 9 hat den name und die version von dev_name als lang
          ????
          Stell lieber mit tatsächlichen Werten dar (in Tabellenform würde sich anbieten), wie das Ergebnis aussehen soll. 5 mal den gleichen Satz zu schreiben vermittelt nicht so viel...
          Dazu natürlich Beispieldaten mit denen man auch wirklich arbeiten kann.
          [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
          [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

          Kommentar


          • #6
            Tabellenstruktur und Daten kannst du auch als SQL-Dump hier rein stellen. Dafür gehst du in HeidiSQL oder PHPMyAdmin auf Export.
            Das kannst du dann natürlich auch gleich mit Sqlfiddle nutzen, wie hier schon angemerkt wurde.

            Kommentar


            • #7
              Ich bezweifle ja, dass SQL für solche dynamischen Felder geeignet ist.

              Code:
              SELECT
                  foo.*,
                  CONCAT('{', GROUP_CONCAT(CONCAT('"', bar.key, '": "', bar.value, '"') SEPARATOR ', '), '}') AS json
              FROM
                  foo
              INNER JOIN
                  bar
              ON
                  foo.id = bar.foo_id
              GROUP BY
                  foo.id
              Damit bekommst alle Felder aus der Tabelle foo und die "dynamischen Felder" aus der Tabelle "bar" in der Spalte json auf die du dann mit json_decode zugreifen kannst.

              Kommentar


              • #8
                Zitat von Blar Beitrag anzeigen
                Damit bekommst alle Felder aus der Tabelle foo und die "dynamischen Felder" aus der Tabelle "bar" in der Spalte json auf die du dann mit json_decode zugreifen kannst.
                Vorsichtig bei sowas, dass ergibt nicht zwangsläufig valides JSON.

                Kommentar


                • #9
                  Zitat von Blar Beitrag anzeigen
                  Ich bezweifle ja, dass SQL für solche dynamischen Felder geeignet ist.
                  Du meinst wohl MySQL. Viele anderen SQL-Datenbanksysteme können das sehr wohl.

                  Kommentar


                  • #10
                    Zitat von hellbringer Beitrag anzeigen
                    Du meinst wohl MySQL. Viele anderen SQL-Datenbanksysteme können das sehr wohl.
                    In welchen relationalen Datenbanken ist das EAV Schema nicht nur ein schlechter Kompromiss?

                    Kommentar


                    • #11
                      Zitat von erc Beitrag anzeigen
                      In welchen relationalen Datenbanken ist das EAV Schema nicht nur ein schlechter Kompromiss?
                      z.B. PostgreSQL und MSSQL können auch JSON-Daten speichern, verarbeiten und generieren.

                      Kommentar


                      • #12
                        Kann MySQL mittlerweile auch:

                        https://mariadb.com/kb/en/library/json-functions/
                        https://dev.mysql.com/doc/refman/5.7...functions.html

                        Bleibt aber ein "schlechter Kompromiss", weil man solche Daten nicht indizieren kann. Zumindest nicht ohne die Hilfe von persistenten Virtual-Columns.

                        Die hier gesuchte Lösung würde wahrscheinlich hiermit abgedeckt sein.

                        Kommentar

                        Lädt...
                        X