Thomas D.: MySQL + count

Mahlzeit liebe SELFHTML Gemeinde...

ich pflege seit einigen Jahren eine Musikseite und möchte nun ermitteln wie lange schon ein Interpret mit seinem Titel in den CHarts ist. Eigentlich kein Problem. SELECT count(*) from top100 where Interpret='Gwen Stefani) and Titel='Cool' ergibt die Summe. Nur den Haken den ich habe ist wie ermittel ich das in meinem Script ? Heisst es muss beim Aufruf der KW automatisch ermittelt werden wie lange der Interpret mit seinem Titel schon in den Charts ist. Ich poste euch mal mal Script und bräuchte da mal Hilfe...

<?php

$db = @MYSQL_CONNECT($server,$benutzer,$kennwort);  mysql_select_db("charts",$db);
//$bioId = mysql_escape_string($bioId);
$result = mysql_query("SELECT * FROM top100, woche WHERE top100.jahr='$jahr' AND woche.jahr='$jahr' and top100.KW='$kw' AND woche.kw='$kw' ORDER BY 'Platz' LIMIT $pos");

while ($row = mysql_fetch_row ($result))
{
if ($row[19] == '<img border="0" src="images/single/new.gif" width="53" height="16">')
        $change = '<font color="#FF0000">Neu';
else if ($row[19] == '<body bgcolor="#000080"><font size ="1" color="#FFFF00">Wiedereinsteiger</font></p>')
        $change = '<img border="0" src="images/single/point.gif" width="12" height="10">';
else if ($row[6] == $row[19])
        $change = '<img border="0" src="images/single/point.gif" width="12" height="10">';
    else if ($row[6] < $row[19])
        $change = '<img border="0" src="images/single/a_up.gif" width="12" height="10">';
else if ($row[6] > $row[19])
        $change = '<img border="0" src="images/single/a_down.gif" width="12" height="10">';

echo "<table width='97%' border='2' bordercolor='#FF9900' align='center'>";
echo "<tr bgcolor='#000080'>";
echo "<td width='6%' align='center'><font color='#FFFFFF'><FONT FACE='Arial' SIZE=2><i><b>$row[6]</b></i></td>";
echo "<td width='12%' align='center'><font color='#FFFF00'><FONT FACE='Arial' SIZE=2><i><b>$row[19]</b></i></td>";
echo "<td width='5%' align='center'><i>$change</i></td>";
echo "<td width='9%' align='center'><font color='#FFFFFF'><FONT FACE='Arial' SIZE=2><i><b>$row[21]</b></i></td>";
echo "<td width='8%' align='center'><i>$row[8]</i></td>";
echo "<td width='19%' align='center'><font color='#FFAC05'><FONT FACE='Arial' SIZE=2><i><b>$row[1]</b></i></td>";
echo "<td width='19%' align='center'><font color='#FFFF00'><FONT FACE='Arial' SIZE=2><i><b>$row[2]</b></i></td>";
echo "<td width='5%' align='center'><i>$row[9]</i></td>";
echo "<td width='5%' align='center'><i>$row[14]</i></td>";
?>

<td width="9%" align="center">
        <a href="biografien.php?bioId=<?php
 echo urlencode($row[1]); ?>
">
            <img border="0" src="images/biografie.gif" width="65" height="15" />
        </a>
    </td>
<?php

wo bekomme ich die Count Anweisung noch untergebracht.

Zur Veranschaulichung guckst du www.singlecharts.org

  1. yo,

    ich pflege seit einigen Jahren eine Musikseite und möchte nun ermitteln wie lange schon ein Interpret mit seinem Titel in den CHarts ist. Eigentlich kein Problem. SELECT count(*) from top100 where Interpret='Gwen Stefani) and Titel='Cool' ergibt die Summe.

    damit ermittelt man nicht wielange ein titel in den charts ist, sondern wieoft. das ist kleiner aber feiner unterschied. sicherlich kann man daraus auch einen zeitraum ermitteln, da die charts in regelmäßigen abständen erscheinen.

    wo bekomme ich die Count Anweisung noch untergebracht.

    mit einer "korelliereden" unterabfrage, was aber wohl erst ab mysql 4.1 und höher gehen wird. wenn das nicht geht, dann nimmst du die unterabfrage mit in die while schleife der ersten abfrage rein. btw., das * würde ich in diesem fall nicht verwenden, sondern die spaltennamen angeben.

    SELECT tab1.*,
      (
      SELECT count(*)
      FROM top100 AS tab2
      WHERE tab2.Interpret= tab1.interpret
      AND tab1.Titel= tab2.titel
      ) AS Anzahl
    FROM top100 AS tab1, woche
    WHERE tab1.jahr='$jahr'
    AND woche.jahr='$jahr'
    AND tab1.KW='$kw'
    AND woche.kw='$kw'
    ORDER BY tab1.'Platz'
    LIMIT $pos

    PS: ich habe den eindruck, dass die verbindung der tabellen top100 und woche eventuell nicht ganz optimal wären. ist aber nur ein gefühl.

    Ilja

    1. Hey Ilja

      Danke erstmal für deine Hilfe, ich hab bei mir Mysql 4.1 irgentwas laufen. Ich habe jetzt meine Abfrage gändert so wie du es gepostet hast.

      <?php

      $db = @MYSQL_CONNECT($server,$benutzer,$kennwort);  mysql_select_db("mp3",$db);
      //$bioId = mysql_escape_string($bioId);
      $result = mysql_query("SELECT tab1.*,
        (
        SELECT count(*)
        FROM top100 AS tab2
        WHERE tab2.Interpret= tab1.interpret
        AND tab1.Titel= tab2.titel
        ) AS Anzahl
      FROM top100 AS tab1, woche
      WHERE tab1.jahr='$jahr'
      AND woche.jahr='$jahr'
      AND tab1.KW='$kw'
      AND woche.kw='$kw'
      ORDER BY tab1.'Platz'
      LIMIT $pos
      ");

      while ($row = mysql_fetch_row ($result))
      {
      if ($row[19] == '<img border="0" src="images/single/new.gif" width="53" height="16">')
              $change = '<font color="#FF0000">Neu';
      else if ($row[19] == '<body bgcolor="#000080"><font size ="1" color="#FFFF00">Wiedereinsteiger</font></p>')
              $change = '<img border="0" src="images/single/point.gif" width="12" height="10">';
      else if ($row[6] == $row[19])
              $change = '<img border="0" src="images/single/point.gif" width="12" height="10">';
          else if ($row[6] < $row[19])
              $change = '<img border="0" src="images/single/a_up.gif" width="12" height="10">';
      else if ($row[6] > $row[19])
              $change = '<img border="0" src="images/single/a_down.gif" width="12" height="10">';

      nur bekomme ich dann als Fehlermeldung

      Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in ausgabe.php on line 155

      Line 155 wäre dann

      while ($row = mysql_fetch_row ($result))

      wie kann das denn jetzt ??

      1. yo,

        Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in ausgabe.php on line 155
        wie kann das denn jetzt ??

        nach der abfrage eine fehlerausgabe mit echo mysq_error() machen und dann schauen, welche fehlermeldung das genau ist. manchmal sind es einfach nur falsche tabellen oder spaltennamen oder aber es ist ein größeres problem.

        Ilja

        1. nach der abfrage eine fehlerausgabe mit echo mysq_error() machen und dann schauen, welche fehlermeldung das genau ist. manchmal sind es einfach nur falsche tabellen oder spaltennamen oder aber es ist ein größeres problem.

          du meintest echo mysql_error();

          echo "<td width='8%' align='center'><i>$row[8]</i></td>";
          echo "<td width='19%' align='center'><font color='#FFAC05'><FONT FACE='Arial' SIZE=2><i><b>$row[1]</b></i></td>";
          echo "<td width='19%' align='center'><font color='#FFFF00'><FONT FACE='Arial' SIZE=2><i><b>$row[2]</b></i></td>";
          echo "<td width='5%' align='center'><i>$row[9]</i></td>";
          echo "<td width='5%' align='center'><i>$row[14]</i></td>";

          echo mysql_error();

          ?>

          Thomas

          Wenn ja, kommt da keine weitere Fehlermeldung

          1. Es liegt definitiv an der Abfrage die du mir gepostet hast.

            ich hab sie mal verändert

            $result = mysql_query("SELECT *
            FROM top100 , woche
            WHERE top100.jahr='$jahr'
            AND woche.jahr='$jahr'
            AND top100.KW='$kw'
            AND woche.kw='$kw'
            ORDER BY top100.'Platz'
            LIMIT $pos
            ");

            und selbiger Fehler wie oben beschrieben.

            1. so diese Abfrage funzt nun

              SELECT top100.*,(SELECT count(*) from top100 as top100 WHERE top100.interpret= top100.interpret AND top100.titel= top100.titel) AS ANZAHL FROM top100, woche WHERE top100.jahr='$jahr' AND woche.jahr='$jahr' and top100.KW='$kw' AND woche.kw='$kw' ORDER BY 'Platz' LIMIT $pos

              nur warum steht in $ANZAHL nichts drin, muessten doch eigentlich die Zahlenwerte enthalten

              1. yo,

                SELECT top100.*,(SELECT count(*) from top100 as top100 WHERE top100.interpret= top100.interpret AND top100.titel= top100.titel) AS ANZAHL FROM top100, woche WHERE top100.jahr='$jahr' AND woche.jahr='$jahr' and top100.KW='$kw' AND woche.kw='$kw' ORDER BY 'Platz' LIMIT $pos

                nur warum steht in $ANZAHL nichts drin, muessten doch eigentlich die Zahlenwerte enthalten

                du musst tabellen mit gleichen spaltennamen schon mit einem eindeutigen tabellennamen kennzeichnen. und da es bei der zweifachen verwendung (2 x top100) einer tabelle nur über aliase geht, musst du diese schon wie beschrieben einsetzen.

                Ilja

            2. yo,

              Es liegt definitiv an der Abfrage die du mir gepostet hast.

              ich hab sie mal verändert

              $result = mysql_query("SELECT *
              FROM top100 , woche
              WHERE top100.jahr='$jahr'
              AND woche.jahr='$jahr'
              AND top100.KW='$kw'
              AND woche.kw='$kw'
              ORDER BY top100.'Platz'
              LIMIT $pos
              ");

              und selbiger Fehler wie oben beschrieben.

              war das nicht deine abfrage oder habe ich da einen fehler beim kopieren gemacht ? wie auch immer, wenn es jetzt funtzt um so besser...

              Ilja