Anzahl Darsteller über 6 Felder

chris47803

Cadet 4th Year
Registriert
Apr. 2007
Beiträge
64
Hallo!

Ich habe in meiner DB eine Tabelle mit Filmen.

Für jeden Darsteller gibt es 1 Feld.

Nun möchte ich folgendes ausgeben lassen.

BEISPIEL:
Clint Eastwood 32 Filme
Bruce Willis 15 Filme

Also, wie oft der Name "Clint Eastwood" in diesen 6 Feldern vorkommt

Mein Problem:
Wie zähle ich diese Einträge über 5 Felder?

Es kommt nämlich vor, das "Clint Eastwood" mal in Feld 1 und mal in Feld 2, oder 3 steht.

Folgendes Script nutzte ich bisher, um in einem Feld zu zählen.

Code:
<table width="100%" cellspacing="0" cellpadding="0" border="1">

<tr>
<th class="heads">Darsteller</th>
<th class="heads">Anzahl</th>
</tr>
<?
//Datei für die DB-Verbindung



include("db-abfrage.php");

$sql = "SELECT darsteller, darsteller2, darsteller3, darsteller4, darsteller5, darsteller6, COUNT(*) AS anzahl FROM filme GROUP BY darsteller, darsteller2, darsteller3, darsteller4, darsteller5, darsteller6 HAVING anzahl > 0 order by anzahl desc";

$result = mysql_query($sql,$dbi) OR die(mysql_error());

	 								 
 
while($row = mysql_fetch_array($result))



{
echo'
  <tr class="feld">
    
    <td width="80%">'.$row['darsteller'].'</td>
    <td width="20%">'.$row['anzahl'].'</td>

  	
  </tr>';
 

};
?>
</table>
 
Erstmal solltest du dir Gedanken über die Datenbank an sich machen. Normalisierung solltest du dir mal zu Gemüte führen. Weil so wird das ganze kein Spass...
 
Hallo!

Ich weiß ja, das ich kein PHP und MySQL Spezi bin. :D

Müssen denn wirklich auch Felder verknüpft werden, die sich in einer Tabelle befinden?

Kannst du mir bitte einen Ansatz liefern?

Gruß, Chris
 
Was bassti sagen wollte ist, dass du eine gesamte Datenbankstruktur überarbeiten solltest.
Wo ist der sinn das du 6 verschieden Felder hat in denen alle das gleich steht? Oder hat es einen speziellen Grund?

Grüße

tewes
 
Mal ne schnelle Übersicht, wie es aussehen sollte:
Tabelle 1: (Schauspieler)
s_id | Name
Tabelle 2: (Filme)
f_id | Filmname
Tabelle 3: (Verknuepfung)
f_id | s_id

Primärschlüssel sind unterstrichen
 
Wo ist der sinn das du 6 verschieden Felder hat in denen alle das gleich steht? Oder hat es einen speziellen Grund?

Der Grund ist, das ich alle Daten in einer Excel-Tabelle habe.
1 x zur Sicherheit und zur einfachen Eingabe neuer Filme.

Die Tabelle speicher ich als *.csv ab und importiere sie in meine Tabelle der Datenbank.

Es steht auch nicht in jedem Feld das Gleiche.
Einige Felder sind sogar leer.

Chris
 
Was soll daran sicherer sein? Und wieso soll es dadruch einfacher sein die Filme zu speichern?
Versteh das grad nicht so ganz.
 
Ich möchte es halt so haben. ;)

Geht es denn nicht, so wie meine DB-Struktur momentan aussieht?
 
Och, wenn die Ausgabe richtig ist, habe ich wieder Spaß. :D

Aber wie gehe ich denn nun vor?

Gruß, Chris
 
Hallo!

Ich habe nun feststellen müssen,
das der Aufwand zu hoch ist,
wenn ich mein DB-Design anpasse.

Hat denn niemand einen Ansatz, wei ich die Darsteller zählen kann?
Danke, Chris
 
Was soll an einer Anpassung des DB-Designs in deinem Fall so schwer bzw aufwändig sein?

Oder anders welches der folgenden Beispiele ist aufwändiger?

A) Du belässt es bei deiner Struktur:
Code:
SELECT 
    CASE WHEN darsteller > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller2 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller3 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller4 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller5 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller6 > '' THEN 1 ELSE 0 END AS anzahl

FROM filme
WHERE
    darsteller > '' OR
    darsteller1 > '' OR
    darsteller2 > '' OR
    darsteller3 > '' OR
    darsteller4 > '' OR
    darsteller5 > '' OR
    darsteller6 > '' 

ORDER  BY 1 DESC


B) Du beschäftigst dich mal mit den Normalformen
Code:
SELECT COUNT(*) AS anzahl
FROM film_darsteller
WHERE film = >filmid/etc.<

Das sollte eigentlich genügen um den Begriff Aufwand hinreichend zu relativieren
 
Zuletzt bearbeitet:
Hallo!

Vielen Dank für deine Antwort.

Mit "Aufwand" meinte ich, das ich nun alles neu eingeben muss,
damit den Darstellern auch eigene IDs zugewiesen werden.
 
Eins Script zur Übername der vorhandenen Daten sollte nicht das große Problem sein...
 
Hallo!

Ich habe mich mal an die Lösung von ag3nt gewagt.

Leider erhalte ich eine komische Ausgabe.

Die Darstellernamen sehe ich gar nicht
und in der 2. Spalte bekomme ich Zahlen von 6 abwärts.

Code:
<table width="100%" cellspacing="0" cellpadding="0" border="1">

<tr>
<th class="heads">Darsteller</th>
<th class="heads">Anzahl</th>
</tr>
<?
//Datei für die DB-Verbindung



include("db-abfrage.php");

$sql = "SELECT 
    CASE WHEN darsteller > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller2 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller3 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller4 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller5 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller6 > '' THEN 1 ELSE 0 END AS anzahl

FROM filme
WHERE
    darsteller > '' OR
    darsteller2 > '' OR
    darsteller3 > '' OR
    darsteller4 > '' OR
    darsteller5 > '' OR
    darsteller6 > '' 

ORDER  BY 1 DESC" ;

$result = mysql_query($sql,$dbi) OR die(mysql_error());
	 								 
 
while($row = mysql_fetch_array($result))


//{
//echo "<pre>";
//print_r($row);
//echo "</pre>";
//}


{
echo'
  <tr class="feld">
    
    <td width="80%">'.$row['darsteller'].'</td>
    <td width="20%">'.$row['anzahl'].'</td>

  	
  </tr>';
 

};
?>
</table>

Das Array ist mit folgenden Daten gefüllt..........
Code:
rray
(
    [0] => 6
    [anzahl] => 6
)

Array
(
    [0] => 6
    [anzahl] => 6
)

Array
(
    [0] => 5
    [anzahl] => 5
)

Array
(
    [0] => 5
    [anzahl] => 5
)

Array
(
    [0] => 5
    [anzahl] => 5
)
.......und so weiter.

Danke, Chris
 
Musst natürlich auch die anderen Spalten mit angeben ;)

Code:
SELECT 
    CASE WHEN darsteller > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller2 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller3 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller4 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller5 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller6 > '' THEN 1 ELSE 0 END AS anzahl

[b][SIZE="6"], *[/SIZE][/b]

FROM filme
WHERE
    darsteller > '' OR
    darsteller1 > '' OR
    darsteller2 > '' OR
    darsteller3 > '' OR
    darsteller4 > '' OR
    darsteller5 > '' OR
    darsteller6 > '' 

ORDER  BY 1 DESC
 
Du meinst so?

Code:
$sql = "SELECT 
    CASE WHEN darsteller > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller2 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller3 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller4 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller5 > '' THEN 1 ELSE 0 END +
    CASE WHEN darsteller6 > '' THEN 1 ELSE 0 END AS anzahl

,darsteller,darsteller2,darsteller3,darsteller4,darsteller5,darsteller6

FROM filme
WHERE
    darsteller > '' OR
    darsteller2 > '' OR
    darsteller3 > '' OR
    darsteller4 > '' OR
    darsteller5 > '' OR
    darsteller6 > '' 

ORDER  BY 1 DESC" ;

Dann ist das Ergebnis aber auch nicht das Gewünschte.........

Code:
Array
(
    [0] => 6
    [anzahl] => 6
    [1] => Burt Reynolds
    [darsteller] => Burt Reynolds
    [2] => Roger Moore
    [darsteller2] => Roger Moore
    [3] => Farrah Fawcett
    [darsteller3] => Farrah Fawcett
    [4] => Dean Martin
    [darsteller4] => Dean Martin
    [5] => Sammy Davis Jr
    [darsteller5] => Sammy Davis Jr
    [6] => Jackie Chan
    [darsteller6] => Jackie Chan
)

Array
(
    [0] => 6
    [anzahl] => 6
    [1] => Jürgen Prochnow
    [darsteller] => Jürgen Prochnow
    [2] => Herbert Grönemeyer
    [darsteller2] => Herbert Grönemeyer
    [3] => Martin Semelrogge
    [darsteller3] => Martin Semelrogge
    [4] => Uwe Ochsenknecht
    [darsteller4] => Uwe Ochsenknecht
    [5] => Claude Oliver Rudolph
    [darsteller5] => Claude Oliver Rudolph
    [6] => Jan Fedder
    [darsteller6] => Jan Fedder
)

An erster Stelle müsste "Clint Eastwood" mit "32" stehen.

Er taucht aber mehrmals auf.
Mal mit 3, mit 2 und mit 1
 
Ach das willst du machen....

da hab ich dich falsch verstanden, das ist mit deinem Datenmodell nicht ohne großere Probleme möglich. Denn dazu müsstest du temporär die Tabelle normalisieren, was an sich schon unsinnig ist, da bei größeren Datenmengen extrem langsam. Das würde dann etwa so aussehen:

Code:
SELECT	darsteller
,		COUNT(*) AS anzahl

FROM (
	SELECT darsteller  FROM  filme	 WHERE darsteller  > '' UNION ALL
	SELECT darsteller2 FROM  filme WHERE darsteller2 > '' UNION ALL
	SELECT darsteller3 FROM  filme WHERE darsteller3 > '' UNION ALL
	SELECT darsteller4 FROM  filme WHERE darsteller4 > '' UNION ALL
	SELECT darsteller5 FROM  filme WHERE darsteller5 > '' UNION ALL
	SELECT darsteller6 FROM  filme WHERE darsteller6 > '' 	
) AS nested

GROUP BY darsteller

ORDER BY 2 DESC
 
Zuletzt bearbeitet:
Na endlich. :jumpin::daumen:

Ich dachte schon, ich wäre nun total daneben.

Es geht wunderbar.

Bei meinem nächsten größeren Projekt werde ich mich
an den Standard halten. ;)

Wenn du noch Zeit und Lust hast, könntest du ja noch kurz erklären,
was hier eigentlich passiert.

Wäre auch für andere interessant, die das hier lesen.

Vielen lieben dank, Chris
 
Das ist eigentlich simpel, es werden nur die verschiedenen Spalten für die Darsteller in einer einzigen Zwischentabelle zusammengefasst, dabei werden nur die Einträge berücksichtigt die nicht leer sind. Und auf diese Zwischentabelle kannst du dann ganz leicht ein Abfrage erstellen, das ist natürlich recht Aufwändig da pro Spalte ein kompletter Tablescan durchgeführt werden muss. Streng genommen ist das was du hier machen musst das Gegenstück zu einer Kreuztabelle.
:volllol:
 

Anhänge

  • bsp.gif
    bsp.gif
    10,9 KB · Aufrufe: 152
Zurück
Oben