helmuthelmut2000
Goto Top

Spalteninhalt und Anzahl aus MSSQL DB mit PHP ausgeben

Hallo,

Ich habe eine mssql Datenbank wo ich mit PHP eine Seite habe wo ich Musiklieder
mit Interpret gespeichert habe.

Jetzt möchte ich folgendes machen.
Ich möchte eine Seite wo ich die Interpreten aufliste und daneben eine Spalte
mit der Anzahl der Lieder wo gespeichert sind.

Also wenn der Interpret Heino mit 20 Lieder drin ist dann sollte da
Heino nur 1x erscheinen und daneben 20.

Kann mir da jemand weiterhelfen, oder mir einen Ansatz oder Tipp geben wie
man so was macht.

Danke.

Gruß
Helmut

Content-Key: 201848

Url: https://administrator.de/contentid/201848

Printed on: April 16, 2024 at 17:04 o'clock

Member: Odde23
Odde23 Feb 15, 2013 at 20:33:49 (UTC)
Goto Top
Hi,

das würde ich mit einem simplen Count(songs) im SQL Statement machen. Eigentlich keine große Sache. Am PHP muss man da nichts anpassen.

Gruß
Odde23
Member: helmuthelmut2000
helmuthelmut2000 Feb 15, 2013 at 20:46:21 (UTC)
Goto Top
Hallo Odde23,

Kannst Du mir das etwas Erklären wie man das macht?

Danke
Member: Odde23
Odde23 Feb 15, 2013 at 20:55:20 (UTC)
Goto Top
Zitat von @helmuthelmut2000:
Kannst Du mir das etwas Erklären wie man das macht?

Wie SQL im Deatil funktioniert, wäre etwas zu komplex um dies hier im Forum zu erläutern. Aber hier mal ein Link, wie das mit dem Count-Befehl funktioniert: http://www.1keydata.com/de/sql/sql-count.php

Grüße
Odde23
Member: EvilMoe
EvilMoe Feb 15, 2013, updated at Feb 16, 2013 at 13:40:45 (UTC)
Goto Top
Das ist nicht alles.
Da nur ein Eintrag angezeigt werden soll muss auf jeden Fall ein GROUP BY auf dem Interpreten angewendet werden. Dann würde ich dort den COUNT in einen Subselect packen. Das würde das gewünschte Ergebnis liefern.

Beispiel:
SELECT musik.* ,  
(
  SELECT COUNT(musik.Interpret) 
  FROM musik AS b 
  WHERE musik.Interpret=b.Interpret
  GROUP BY b.Interpret
) as Anzahl 
FROM musik 
GROUP BY musik.Interpret
Ich glaube so müsste die Syntax sein.


EDIT: Ich glaube so könnte es funktionieren.
Member: helmuthelmut2000
helmuthelmut2000 Feb 15, 2013 at 21:19:23 (UTC)
Goto Top
Mit dem Count Befehl kann ich nur die Anzahl der Zeilen in einer Spalte zählen.

Ich möchte aber die Verschieden Spalteninhalte zählen.

z.B.
Es gibt eine Spalte mit Interpret und eine Spalte mit Songs.

In Spalte Interpret gibt es z.B. 10x den Interpret A weil es da auch 10 Songs dazu gibt, und 20x den Interpret B
weil es da 20 Songs dazu gibt.

Jetzt sollte das so erscheinen:

A 10x
B 20x

usw.
Member: Guenni
Guenni Feb 16, 2013 at 05:46:47 (UTC)
Goto Top
z.B. Es gibt eine Spalte mit Interpret und eine Spalte mit Songs . . .

Hi,

. . . in einer Tabelle? Schon mal was von Normalisierung gehört? http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)

Tabelle 1 - Interpreten

Tabelle 2 - Lieder, wobei jedem Lied die ID des Interpreten zugeordnet wird.


select interpret, count(lied) as "Anzahl Lieder" from interpreten, lieder  

where interpreten.id = lieder.id

group by interpret

Gruß
Günni
Member: LianenSchwinger
LianenSchwinger Feb 16, 2013 at 09:20:54 (UTC)
Goto Top
Hallo,

Leute verwirrt ihn doch nicht mit Normalisierung oder dergleichen. Der Threadersteller scheint wenig bis keine Kenntnisse in SQL zu haben.

Also einfachstes Statement:

SELECT a.interpret,
       COUNT(a.titel) As AnzLieder,
FROM MusikTabelle AS a
GROUP BY a.interpret

Gruß Jörg
Member: helmuthelmut2000
helmuthelmut2000 Feb 16, 2013 at 13:03:24 (UTC)
Goto Top
Hallo,

Kannst Du mir das a. etwas Erklären?

Danke.
Member: EvilMoe
EvilMoe Feb 16, 2013 updated at 13:06:45 (UTC)
Goto Top
Das kannst du auch weg lassen, er hat der Tabelle "MusikTabelle" nur einen Alias zugewiesen.
FROM MusikTabelle AS a 
Im Prinzip kannst Du bei einem SELECT in nur einer Tabelle das "a." und das "AS a" weglassen.
Member: helmuthelmut2000
helmuthelmut2000 Feb 16, 2013 at 13:21:02 (UTC)
Goto Top
Hallo,

Das ist nicht das was ich mir vorgestellt habe.

Ich möchte nur, wenn ich die Spalte Interpret selectiere, nicht die Interpreten z.B. 20mal
den gleichen Namen da stehen habe.
Sondern der Name sollte nur ein mal erscheinen und dann die Anzahl wie oft es den Namen in der
Spalte Interpret gibt.
Member: EvilMoe
EvilMoe Feb 16, 2013 updated at 13:30:01 (UTC)
Goto Top
Du möchtest das hier:
SELECT interpret, COUNT(interpret) As Anzahl,
FROM MusikTabelle
GROUP BY interpret
Dies meinten meine Vorredner.

EDIT: Ich hoffe du weißt, dass Du auch Dein Script leicht anpassen musst? Denn du bekommst nun einen zusätzlichen Wert aus deinem Query.
Member: Guenni
Guenni Feb 16, 2013 at 15:42:32 (UTC)
Goto Top
Zitat von @helmuthelmut2000:
Hallo,

Das ist nicht das was ich mir vorgestellt habe.

Ich möchte nur, wenn ich die Spalte Interpret selectiere, nicht die Interpreten z.B. 20mal
den gleichen Namen da stehen habe.
Sondern der Name sollte nur ein mal erscheinen und dann die Anzahl wie oft es den Namen in der
Spalte Interpret gibt.


Hi Helmut,

es gibt zwei Möglichkeiten.

1. So wie du deine DB beschreibst . . .

Interpret Titel
Heino Schwarzbraun ist die Haselnuss
Heino Caramba, Caracho ein Whiskey
Heino Rammstein

. . . ist es einigermaßen daneben.

Stell' dir mal Interpret erweitert als Stammdaten vor, mit PLZ, Ort, Strasse, Telefon, Fax etc. . . .

Titel wäre dann ein Detail von Stammdaten. Würdest du zu jedem Detail, das du einfügst, jedesmal die

ganzen Stammdaten eintragen wollen? Dann sähe deine Tabelle so aus . . .

Interpret PLZ Ort Strasse Telefon Fax Titel
Heino 12345 HeinoStadt HeinoStrasse HeinoTelefon HeinoFax Schwarzbraun ist die Haselnuss
Heino 12345 HeinoStadt HeinoStrasse HeinoTelefon HeinoFax Caramba, Caracho ein Whiskey
Heino 12345 HeinoStadt HeinoStrasse HeinoTelefon HeinoFax Rammstein
. . . usw..


2. Möglichkeit (eine Form der Normalisierung)

Tabelle Interpret (Stammdaten)

ID Interpret PLZ Ort Strasse Telefon Fax
1 Heino 12345 HeinoStadt HeinoStrasse HeinoTelefon HeinoFax
2 Die Ärzte 23456 ÄrzteStadt ÄrzteStrasse ÄrzteTelefon ÄrzteFax

Tabelle Titel (Details)

ID Titel
1 Schwarzbraun ist die Haselnuss
1 Caramba, Caracho ein Whiskey
1 Rammstein
2 Schrei nach Liebe
2 Männer sind Schweine

So erhälst du mit . . .

select interpret, count(titel) as "Anzahl Titel" from interpret, titel   

where interpret.id = titel.id

 group by interpret

. . . dein gewünschtes Ergebnis:

Heino(3)
Die Ärzte(2)

Auch andere Info, die in den Details vorhanden sein können (Liveauftritt, Erscheinungsjahr, Album etc.), lassen sich so leicht abfragen.


Gruß
Günni
Member: LianenSchwinger
LianenSchwinger Feb 16, 2013 at 18:17:23 (UTC)
Goto Top
Hallo,

was jetzt noch fehlt ist eine Tabelle mit den Daten zum Album:

Name, Erscheinungsdatum, Anzahl CD'S, Cover, Studio usw.

G Jörg
Member: Guenni
Guenni Feb 17, 2013 updated at 09:49:29 (UTC)
Goto Top
Zitat von @LianenSchwinger:
Hallo,

was jetzt noch fehlt ist eine Tabelle mit den Daten zum Album:

Name, Erscheinungsdatum, Anzahl CD'S, Cover, Studio usw.

G Jörg

Genau! Dann lernt er gleich, wie mans richtig macht, anstatt Daten in einer Tabelle redundant abzulegen.

Ein kleiner Schreibfehler in den Stammdaten (Interpret), schon ists vorbei mit group by.

Gruß
Günni
Member: helmuthelmut2000
helmuthelmut2000 Feb 17, 2013 at 10:32:49 (UTC)
Goto Top
Hallo,

Das hab ich jetzt so hinbekommen.

Danke für die Hilfe.

Gruß
Helmut
Member: Guenni
Guenni Feb 17, 2013 updated at 12:23:05 (UTC)
Goto Top
Zitat von @helmuthelmut2000:
Hallo,

Das hab ich jetzt so hinbekommen.

Danke für die Hilfe.

Gruß
Helmut

Kannst du auch mal erläutern, wie du es so hinbekommen hast?

Wäre vielleicht auch nützlich für andere face-smile

Gruß
Günni
Member: LianenSchwinger
LianenSchwinger Feb 17, 2013 updated at 12:14:24 (UTC)
Goto Top
Hallo Helmut,

das "AS a" ist nur das Bilden eines Alias-Namens für die Tabelle "MusikTabelle" aus meinem Beispiel.
So kann ich einfach "a.interpret" statt "MusikTabelle.interpret" schreiben. Wobei bei nur einer Tabelle brauche ich nicht zwingend einen Alias bzw. überhaupt die Referenz auf den Tabellennamen.

G Jörg