Hilfe: Doppelte Werte filtern

boufier

Grünschnabel
Einen schönen guten Abend,

ich stehe vor dem Problem, wie ich doppelte Werte in einem Array vermeiden kann.

so sieht die Tabelle aus:

2tabsql.jpg


in der vidid spalte werde alle videoids eingetragen von den actoren.

Ziel ist: auf der Actorseite sollen alle actoren angezeigt, die gleiche filme gedreht haben. Die Actoren sollen aber nur einmal angezeigt werden.

so sieht es aus auf der actorseite:
endsql.jpg


rechts im Block sieht man die doubletten :(

ich würde auch gerne bei jedem actor die anzahl der filme, die sie mit dem actor von der aktuellen seite gedreht haben.

anbei mein versuch in php:
PHP:
$categoryxc = $db->sql_query("SELECT * FROM artist_vid WHERE artistid=$id");

$nrows = $db->sql_numrows($categoryxc);

while($rowxc = $db->sql_fetchrow($categoryxc)) {
$vidid = $rowxc['vidid'];

$resultsa = $db->sql_query("select * from artist_vid WHERE vidid=$vidid AND artistid !=$id");

while($rowxcx = $db->sql_fetchrow($resultsa)) {
$artistid = $rowxcx['artistid'];

$resultsax = $db->sql_query("SELECT * FROM artist WHERE id =$artistid");
$row = $db->sql_fetchrow($resultsax);
$idix = $row['id'];
$image = $row['thumbimg'];
$title = filter($row['name'], 'nohtml');

ich hoffe ihr habt einige vorschläge
 
So müsste das gehen (ungetestet)

SQL:
SELECT			a.name, COUNT(*)
FROM			artist_vid AS v, artist AS a
WHERE			v.artistid = $artistid
AND				a.id = v.artistid
GROUP BY		a.id

Edit: Übrigens könnte man dein Schema noch weiter normalisieren. Also eine Tabelle nur für die Filme und eine weitere, welche Filme mit Schauspielern verbindet.
 
Vielleicht war es gestern schon zu spät. Aber eigentlich solltest du mit der Abfrage nicht das gleiche Ergebnis bekommen, sondern nur den Schauspieler, auf dessen Seite du ohnehin schon bist :-D

Versuchs mal so

SQL:
SELECT			a.id, a.name, COUNT(*)
FROM			artist_vid AS v, artist AS a
WHERE			v.artistid IN
				(
					/*Alle Filme dieses Schauspielers*/
					SELECT vidid FROM artist_vid WHERE artistid = $artistid
				)
AND				a.id = v.artistid /*Zu diesen Filmen die Infos zu den Schauspielern*/
AND				a.id != $artistid /*Außer der jetzige*/
GROUP BY		a.id /*Nur je ein Datensatz pro Schauspieler*/

Und der Satz zur Normalisierung den hätte ich mir gestern glaube ich auch sparen können.
 
Guten Morgen CPoly,
mit dieser Abfrage bekomme ich überhaupt kein ergebnis. kann sein dass suquery bei mir nicht unterstützt wird. Meine Datenbank läuft auf MySQL-Client-Version: 5.0.84.

Und der Satz zur Normalisierung den hätte ich mir gestern glaube ich auch sparen können.
Danke für den Hinweis :) die Tabellen, die du vorgeschlagen hast, die habe ich schon erstellt. Haupttabelle mit den Filmen. 2 Tabelle: Filme mit Schauspielern. 3 Tabelle: nur Schauspieler

so sieht die jetzige abfrage:
PHP:
$result  = $db->sql_query("SELECT a.id, a.name, a.thumbimg, COUNT(*) FROM artist_vid AS v, artist AS a WHERE v.artistid IN ( SELECT vidid FROM artist_vid WHERE artistid='".$id."') AND a.id = v.artistid AND a.id !='".$id."' GROUP BY a.id");
echo $result; //liefert dies: Resource id #413
 
Zuletzt bearbeitet:
@CPoly stimmt es lag daran danke. jetzt klappt es.
ich würde gerne unterm Bild von jedem Actor die Anzahl der Filme hinzufügen, die sie mit dem Actor von der Aktuellen seite gedreht haben.
 
@CPoly: meinst du so:
PHP:
$result  = $db->sql_query("SELECT a.id, a.name, a.thumbimg, COUNT(*), v.vidid FROM artist_vid AS v, artist AS a WHERE v.vidid IN ( SELECT vidid FROM artist_vid WHERE artistid='".$id."') AND a.id = v.artistid AND a.id !='".$id."' GROUP BY a.id");
$nrows = $db->sql_numrows($result ); 

echo "$nrows"; // hier erhalte ich die gesamte Anzahl von den Actoren
wie sieht dann die ausgabe für die videos pro Actor aus?

ich hab dies ausprobiert:
PHP:
while($row = $db->sql_fetchrow($result)) {
$vidid = $row['vidid'];
$countvid= count($vidid);
echo "$countvid";

ist es richtig?
 
Zuletzt bearbeitet:
Du musst den Wert einfach nur auslesen.

PHP:
while($row = $db->sql_fetchrow($result)) {
    echo $row[3];//Oder falls man hier nicht mit Indizes zugreifen kann, gib COUNT(*) in der Abfrage einen Alias
}
 

Neue Beiträge

Zurück