Entwickler imm Query als Array ausgeben

Alles, was PHP betrifft, kann hier besprochen werden.

Entwickler imm Query als Array ausgeben

Postby Grandmaster » 09. June 2016 22:40

Hallo,

wir haben ein Spiel zu dem 2 Entwickler gehören. Versucht man dies anzeigen zu lassen, werden 2 Zeilen ausgegeben, die sich im Namen der Entwickler unterscheiden. Wie kriege ich jetzt die beiden Entwickler in eine Zelle, sodass nur eine Zeile für ein Spiel angezeigt wird? Ich weiß, das macht man über einen Array, jedoch weiß ich nicht, wie ich das anstellen soll. Was ein Array ist, weiß ich, aber leider gibt es keine Video, wie man den Array Datenbanken anwendet... Falls ihr solch ein Video finden solltet, könnt ihr ruhig das Video als Link mir zusenden!

Code: Select all
videospiel.Titel AS Titel,
entwickler.Name_E AS entName
FROM entwickelt
JOIN videospiel
ON videospiel.V_ID = entwickelt.V_ID
JOIN entwickler
ON entwickler.ID = entwickelt.Name_E


und

Code: Select all
$result = $conn->query($sql);
   while($row = $result->fetch_object())
   
{                             
                                 $Entwickler              = $row->entName;
            $Titel                  = $row->Titel;
                             
              echo "
          {$Entwickler} {$Titel}
             ";
 }

$conn->close();
   


Was müsst ich, wo ergänzen damit am Ende alle Entwickler in einer Zelle angezeigt werden?
Ihr könnt auch gerne an einem von euch gewähltem Beispiel zeigen, wie das geht! Muss nur das Prinzip verstanden haben!

Vielen Danke!
Grandmaster
 
Posts: 14
Joined: 01. May 2016 11:28
XAMPP version: 3.2.2
Operating System: Windows 10

Re: Entwickler imm Query als Array ausgeben

Postby Nobbie » 10. June 2016 10:48

Dafür braucht man nicht unbedingt ein Array, wichtig ist lediglich, dass Du nicht sofort via echo gleich den Namen ausgibst, sondern erst einmal die Namen sammelst. Das kann man u.a. in einem Array machen, man kann aber beispielsweise auch einen normalen String immer "verlängern" (also den nächsten Namen an den vorhandenen Namen dran hängen). Und die Ausgabe erfolgt erst nach der while-Schleife, nicht schon darin.

In PHP kann man zwei Strings aneinanderhängen, in dem man einen Punkt dazwischen schreibt, also beispielsweise so:

Code: Select all
$uralt = "def";
$alt = "abc";

$neu = $alt . $uralt;


Das ist aber elementares PHP, solltest Du schon kennen.

Arrays sind auch nichts schweres, sicherlich findest Du auch ohne meine Hilfe ein Tutorial über PHP Arrays. Mit Datenbanken hat das auch gar nichts zu tun, die Werte stehen nach dem Query und dem Fetch ja schon als String zur Verfügung, die Strings musst Du weierverarbeiten.

Übrigens wird in Deinem Beispiel nicht jeder Entwickler in einer neuen Zeile gezeigt, die stehen (mit Titel) alle hintereinander. In Deinem Programm wird kein Zeilenumbruch ausgegeben (zumindest nicht im Browser im HTML Format).

P.S.: Ich erkenne gerade erst, dass Du so einen extrem langen String in Quotes ausgibst. Das tut man auch nicht, in HTML erzwingt man einen Zeilenumbruch durch das TAG "<br>". Und im Texteditor ezwingt man einen Umbruch durch "\n" bzw. "\r\n" (Linux bzw. Windows). Aber nicht so elende lange Zeichenketten mit Leerstellen ausgeben, das ist Käse.
Nobbie
 
Posts: 8775
Joined: 09. March 2008 13:04

Re: Entwickler imm Query als Array ausgeben

Postby Altrea » 10. June 2016 12:09

Je nach Datenbankstruktur und Verwendung kann man die Namen auch schon im SQL Statement zusammenfassen, zum Beispiel über die Funktion GROUP_CONCAT()
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 8294
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 10 Pro x64

Re: Entwickler imm Query als Array ausgeben

Postby Altrea » 10. June 2016 12:09

Hi,

Je nach Datenbankstruktur und Verwendung kann man die Namen auch schon im SQL Statement zusammenfassen, zum Beispiel über die Funktion GROUP_CONCAT()

Mit freundlichen Grüßen,
Altrea
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 8294
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 10 Pro x64

Re: Entwickler imm Query als Array ausgeben

Postby Grandmaster » 11. June 2016 17:23

Hat mit GROUP_CONCAT funktioniert! Wie mache ich das jetzt für den Publisher? Wenn ich das gleiche mit dem Publisher mache, kommt für die Spiele mit n-Entwicklern n-Publisher, auch wenn nur 1 Publisher für dieses Spiel in der Datenbank eingetragen ist... Der gleiche Publisher wiederholt sich dann n Mal...
Code: Select all
$sql ="SELECT 
videospiel.Titel AS Titel,
GROUP_CONCAT(entwickler.Name_E) AS entName,
videospiel.Plattform,
videospiel.FSK,
GROUP_CONCAT(publisher.Name) AS pubName,
videospiel.Genre AS Genre
FROM entwickelt
JOIN videospiel
ON videospiel.V_ID = entwickelt.V_ID
JOIN entwickler 
ON entwickler.ID = entwickelt.Name_E
JOIN published
ON entwickelt.V_ID = published.V_ID
JOIN publisher
ON publisher.ID = published.Name
WHERE "
.$abfrage ." OR  "$abfrage2 ." OR ".$abfrage3 .
"GROUP BY videospiel.V_ID" 
Grandmaster
 
Posts: 14
Joined: 01. May 2016 11:28
XAMPP version: 3.2.2
Operating System: Windows 10

Re: Entwickler imm Query als Array ausgeben

Postby Nobbie » 11. June 2016 19:58

Das darf Dir jetzt Altrea erklären. Ich finde nämlich, dass die "GROUP_CONCAT" Funktion (ohnehin ein Special von MySQL) gegen sämtliche Datenbankmodelle und Theorien verstößt, die Funktion gehört verboten so schrecklich finde ich die.
Nobbie
 
Posts: 8775
Joined: 09. March 2008 13:04

Re: Entwickler imm Query als Array ausgeben

Postby Grandmaster » 11. June 2016 20:45

:D

Leider kann ich mir nichts darunter vorstellen, in einem Array Daten zu speichern, dann erst auszugeben bzw. keine Ahnung, wie ich das anstellen soll. Daher ist die GROUP_CONCAT Funktion eine perfekte "Notlösung". Wenn du willst kannst du ja mal einen Code hier lassen, in dem steht, wie ich das auf deine Weise hinkriegen würde ;P.
Grandmaster
 
Posts: 14
Joined: 01. May 2016 11:28
XAMPP version: 3.2.2
Operating System: Windows 10

Re: Entwickler imm Query als Array ausgeben

Postby Altrea » 11. June 2016 21:27

Nobbie wrote:Ich finde nämlich, dass die "GROUP_CONCAT" Funktion (ohnehin ein Special von MySQL) gegen sämtliche Datenbankmodelle und Theorien verstößt, die Funktion gehört verboten

Würde mich mal interessieren weshalb du diese Meinung hast. Group_Concat ist ein Mitglied der Gruppierungsfunktionen. Bist du also generell der Meinung, dass Gruppierung nicht in die Verantwortung der Datenbank gehört?
Ganz nebenbei kennen auch andere SQL basierte Datenbanksysteme ähnliche Funktionen. Oracle zum Beispiel kennt die Listagg Funktion.
Autoincrement ist auch etwas was nicht alle SQL Datenbanksysteme kennen, lehnst du auch dies ab und beschreibst dies immer über einen Trigger?

Zurück zum Thema: Welche Datenfelder überhaupt Sinn machen zu gruppieren hängt ebenfalls stark von der Datenbasis ab, speziell von der Gruppierungsbedingung. Es ist schwer zu beantworten und etwas zu raten ohne die komplette Datenbasis zu kennen.
Im Zweifel bleibt immer die Möglichkeit die Daten über PHP zusammenzustellen , was aber bei weitem nicht so performant ist wie direkt über die Datenbank.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 8294
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 10 Pro x64

Re: Entwickler imm Query als Array ausgeben

Postby Nobbie » 11. June 2016 21:41

Altrea wrote:Würde mich mal interessieren weshalb du diese Meinung hast. Group_Concat ist ein Mitglied der Gruppierungsfunktionen. Bist du also generell der Meinung, dass Gruppierung nicht in die Verantwortung der Datenbank gehört?


Gruppierung ist ein SQL Feature. Das hat mit dieser furchtbaren Funktion nichts zu tun. Aber die GROUP_CONCAT Funktion unterstützt aktiv die schlechten Programmierer, die kein vernünftiges Datenmodell hinbekommen und Tabellen mit "variablen Breiten" umsetzen. Anstatt ein vernünftiges Modell zu entwerfen (typischerweise bei m:n Relationen), wird von vielen Anfängern so ein Mist programmiert, dass in einer Spalte genau so eine variable Ansammlung von CSV Werten steht, grauenhaft. Und genau das unterstützt die Funktion aktiv.
Nobbie
 
Posts: 8775
Joined: 09. March 2008 13:04

Re: Entwickler imm Query als Array ausgeben

Postby Altrea » 12. June 2016 09:26

Nobbie wrote:Aber die GROUP_CONCAT Funktion unterstützt aktiv die schlechten Programmierer, die kein vernünftiges Datenmodell hinbekommen und Tabellen mit "variablen Breiten" umsetzen. Anstatt ein vernünftiges Modell zu entwerfen (typischerweise bei m:n Relationen), wird von vielen Anfängern so ein Mist programmiert, dass in einer Spalte genau so eine variable Ansammlung von CSV Werten steht, grauenhaft. Und genau das unterstützt die Funktion aktiv.

Es ist genau umgekehrt. Die Funktion GROUP_CONCAT unterstützt das selektieren aus vernünftigen Datenmodellen heraus (i.d.R Tabellen der 3. Normalform).

Ein Beispiel: Du hast eine Datenbank mit den Datenbanktabellen Songs, Interpreten und Komponisten und zwei Hilfstabellen die die m:n Beziehungen der Songs zu Interpreten und der Songs zu Komponisten abbildet. Die Anforderung sei alle Songs mit all ihren jeweiligen Interpreten und Komponisten auszugeben.

Mit GROUP_CONCAT und einer GROUP_BY song.id ist dies mit einer einzelnen SQL Anweisung ohne PHP getan.

zurück zum Thema:
Um die Mehrfachnennung einer gruppierten Palte zu vermeiden verwende DISTINCT.
GROUP_CONCAT(DISTINCT `tabelle`.`spalte`)
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 8294
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 10 Pro x64

Re: Entwickler imm Query als Array ausgeben

Postby Grandmaster » 12. June 2016 09:33

Beide Tabellen sind eigentlich gleich aufgebaut. Es besteht eine n:m Beziehung in den Tabellen entwickelt und published:
So ungefähr
Haupttabelle
V_ID , Genre, Plattform und Titel

Tabelle Entwickler
ID und Name_E

Tabelle entwickelt
ID, V_ID und entID

Tabelle Publisher
ID und Name

Tabelle published
ID, V_ID und pubID


Hm...Sollte es dann eigentlich nicht funktionieren?
Grandmaster
 
Posts: 14
Joined: 01. May 2016 11:28
XAMPP version: 3.2.2
Operating System: Windows 10

Re: Entwickler imm Query als Array ausgeben

Postby Altrea » 12. June 2016 09:50

Es funktioniert ja auch. In etwa so

Code: Select all
SELECT
...
GROUP_CONCAT(DISTINCT `Entwickler`.`Name_E`),
GROUP_CONCAT(DISTINCT `Publisher`.`Name`),
...
GROUP_BY `videospiel`.`V_ID`


Noch die richtigen JOINS angewendet, fertig.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 8294
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 10 Pro x64

Re: Entwickler imm Query als Array ausgeben

Postby Nobbie » 12. June 2016 11:31

Altrea wrote:Die Funktion GROUP_CONCAT unterstützt das selektieren aus vernünftigen Datenmodellen heraus (i.d.R Tabellen der 3. Normalform).


Das ist eine simple Aggregatfunktion, die alle Werte als CSV String zusammenpappt. Was hat das mit 3. Normalform zu tun??? Die unterstützt jede Tabelle und jedes Modell, egal wie falsch oder richtig das Modell ist. Die Funktion leistet so gut wie nichts, es ist eine reine Stringfunktion zur Druckausgabe. Ob man PHP braucht oder nicht, hängt viel mehr von der Infrastruktur ab, die Ausgabe in HTML wird man mit reinem SQL nicht hinbekommen.

Die Funktion erspart mehr oder minder einen simplen implode() Aufruf. Sonst gar nichts. Selbstverständlich kann man die gestellte Aufgabe genauso simpel lösen, in dem man mit einfachen Querys und Subquerys die geeignete Fundstelle zusammenbaut und wenn man dann unbedingt eine gruppierte Ausgabe mit CSV Strings haben will (eigentlich keine schöne Ausgabe), kann man auch per implode ein Array zusammenpappen. Das ist doch gehupft wie gesprungen, die Funktion GROUP_CONCAT leistet doch lächerliches.

Die viel größere Gefahr ergibt sich aber genau aus dem Problem, dass das wirklich nur eine reine Druckaufbereitung ist, sonst gar nichts, aber auf Grund der CSV Struktur manche Programmierer dazu verleitet, mit den aufbereiteten Werten wieder auf die Datenbank zuzugreifen (mit explode() kann man die ja prima wieder auseinandernehmen und in Arrays weiterverarbeiten) und da wird es grausam. Ich sehe keinen Sinn in dieser Funktion und es ist auch ein typischer Alleingang von MySQL.

Und ein anderes Problem besteht darin, dass bereits im SQL Zugriff die Druckausgabe formatiert wird. Das finde ich auch extrem häßlich. Mit sauberen Tabellen würde ich die Druckaufbereitung immer in den PHP Teil legen, wenn mal die Anforderung kommt, dass die Ausgabe irgendwie angepasst werden soll, bleibt der Datenzugriffsteil unberührt. Wenn man aber GROUP_CONCAT verwendet und die Ausgabe benutzt, muss man in das SQL gehen, obwohl die Fundstelle und Schnittstelle sich gar nicht ändert.

Die komische Anmerkung in Sachen "DISTINCT" (steht auch so seltsam bei MySQL auf der Seite) verstehe ich auch nicht, in richtigem ANSI SQL (Oracle beispielsweise) sind DISTINCT und GROUP BY vollkommen synonym. Eigentlich benötigt man nicht beide Begriffe.
Nobbie
 
Posts: 8775
Joined: 09. March 2008 13:04

Re: Entwickler imm Query als Array ausgeben

Postby Grandmaster » 12. June 2016 11:57

Anscheinend habe ich die richtigen Joins angewendet, denn es funktioniert! Dankeschön!
Grandmaster
 
Posts: 14
Joined: 01. May 2016 11:28
XAMPP version: 3.2.2
Operating System: Windows 10


Return to PHP

Who is online

Users browsing this forum: No registered users and 3 guests