Spalte in 2 Tabellen vergleichen

dsNDesign

Erfahrenes Mitglied
Hi,
ich habe folgenden MySQL Befehl:
PHP:
$result2 = mysql_query("SELECT id FROM comment, news WHERE comment.id = news.id");
$menge = mysql_num_rows($result2);

Jedoch bekomme ich immer folgenden Fehler: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /users/dplace/www/Test Version/index.php on line 31
line 31 ist $menge = mysql_num_rows($result2);

Wenn ich hinter die query noch ein or die (mysql_error()) setzte kommt das: Column 'id' in field list is ambiguous

Wo genau liegt mein Fehler? Ich hoffe, mir kann jemand helfen.
 
Zuletzt bearbeitet:
wie genau meinst du das?
so?

PHP:
$result2 = mysql_query("SELECT comment.id, news.id FROM comment, news WHERE comment.id = news.id");
$menge = mysql_num_rows($result2);
 
Da die IDs ja eh beide gleich sind, sollte es für deine Zwecke reichen nur eine abzufragen. Wenn du willst, dass das Feld weiterhin id heißt, dann kannst du auch noch ein AS id hinzufügen:
PHP:
$result2 = mysql_query("SELECT news.id AS id FROM comment, news WHERE comment.id = news.id");
$menge = mysql_num_rows($result2);
 
Hi,
es funktioniert jetzt soweit. Nur ist mir aufgefallen, dass das, was ich will so auch nicht funktioniert. Ich stehe nämlich jetzt eher vor einem logischem Problem.

Mein vorhaben. Ich bin gerdae dabei, eine Kommentar funktion zu meinem News-System zu bauen. Die Kommentar funktion funktioniert auch soweit schon perfekt. Hier erstmal der Aufbau:

PHP:
<?php include_once("db_news.php");
include_once("db_showcomment.php");
$result2 = mysql_query("SELECT comment.id, news.id FROM comment, news WHERE comment.id = news.id");
$menge = mysql_num_rows($result2);

$sql = "SELECT * FROM `news`;";
$eintrage = mysql_num_rows(mysql_query($sql));
$maxproseite = 3;
 
$i = 0;
$ab =1;
if (isset($_GET['page'])) $ab = $_GET['page'];

$anzahl_seiten = ($eintrage / $maxproseite);

if (!isset($_GET['page'])) {
    $sql = "SELECT * FROM `news` ORDER BY `id` DESC LIMIT 0,".$maxproseite.";";  
} else {
    $abeintrag = $_GET['page'] * $maxproseite - $maxproseite;
    $sql = "SELECT * FROM `news` ORDER BY `id` DESC LIMIT ".$abeintrag.",".$maxproseite.";";
}
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
	if(!isset($_GET['id'])) {
    echo '
  <div style="margin-left:10px">
  <a href="index.php?id='.$row['id'].'"><b>'.$row['titel'].'</b></a><br />
  <a class="datum">'.$row['datum'].'</a><br />
  '.$row['text'].'<br /><br /></div>
  <div align="center"><img src="image/grenze.png" alt="gre"/></div><br />';
    }}
$i=$ab ;
if($i > 1 and !isset($_GET['id']))
{
   echo "<a href=\"index.php?section=gb&amp;page=".($i-1)."\">&lt;&lt;Zur&uuml;ck</a> ";
} 
if($i <= $anzahl_seiten and !isset($_GET['id']))
{
   echo "&nbsp;&nbsp;<a href=\"index.php?section=gb&amp;page=".($i+1)."\">N&auml;chste&gt;&gt;</a>";
}

include_once("comment.php");
?>

und die comment.php:
PHP:
<?php // Kommentar anzeigen
$id = $_GET['id'];

 $sql2 = mysql_query("SELECT * FROM news WHERE id = '$id'");
 if($row = mysql_fetch_assoc($sql2) and isset($_GET['id'])) {
    echo '
  <div style="margin-left:10px">
  <b>'.$row['titel'].'</b><br />
  <a class="datum">'.$row['datum'].'</a><br />
  '.$row['text'].'<br /><br /></div>
  <div align="center"><img src="image/grenze.png" alt="gre"/></div><br />';
}
?>
<?php include_once("db_showcomment.php"); // Kommentar abrufen
$id = $_GET['id'];
$sql = "SELECT * FROM comment;";
$eintrage = mysql_num_rows(mysql_query($sql));
 


 if (isset($_GET['id'])) {
    $sql = "SELECT * FROM comment WHERE id = $id ORDER BY idgb";  
} else {
    $sql = "SELECT * FROM comment ORDER BY idgb";
}
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
	if(isset($_GET['id'])) {
    echo '
  <br />
  <table border="0"><colgroup><col width="237" /><col width="250" /></colgroup>
  <tr>
    <td valign="top"><b>Kommentar von '.$row['name'].'</b></td>
    <td valign="top"><font color="#5c5c5c" style="font-style:italic">geschrieben am '.$row['datum'].' um '.$row['uhr'].' Uhr</font></td>
  </tr>
</table>';
	echo '
	<table border="0"><colgroup><col width="90" /><col width="397" /></colgroup>
  <tr>
  <td valign="top">';if (!empty ($row['email'])) {
  echo '
       <a href="mailto:'.$row['email'].'"><img src="gif/email.png" alt="mail"/></a>&nbsp;&nbsp;';}
		if (!empty ($row['url'])) {
  echo '
       <a href="http://'.$row['url'].'" target="_blank"><img src="gif/hp.png" alt="hp" /></a>&nbsp;&nbsp;';}
	echo '</td>
  <td valign="top">'.$row[textnachricht]=str_replace("\n","<br />",$row[textnachricht]).'</td>
  </tr>
</table>
<br /><div align="center"><img src="image/grenze.png" alt="gre"/></div>';
    } }
?>
<br /><br /><center><a href="#" onclick="document.getElementById('layer1').style.visibility='visible';">Kommentar schreiben</a></center><br />
<? $id = $_GET['id'];  // Kommentar schreiben
if(isset($_GET['id'])) {
echo "
<div id='layer1' style='visibility:hidden'><form method='post' action='comment_senden.php'>
<center><table border='0' cellpadding='1' cellspacing='2'>
<tr>
  <td>Ihr Name:</td>
  <td><input type='text' name='name' /></td>
</tr>
<tr>
  <td>eMail:</td>
  <td><input type='text' name='email' /></td>
</tr>
<tr>
  <td>Homepage:</td>
  <td><input type='text' name='url' /></td>
</tr>
<tr>
  <td>Ihr Eintrag:</td>
  <td><textarea name='textnachricht' ></textarea></td>
</tr>
<tr>
  <td><input type='hidden' name='datum' value='$datum = date('d.m.Y',$timestamp); echo $datum;' /></td>
</tr>
<tr>
  <td><input type='hidden' name='uhr' value='$uhr = date('H:i',$timestamp); echo $uhr;' /></td>
</tr>
<tr>
  <td><input type='hidden' name='id' value='$id' /></td>
</tr>
<tr>
<td></td>
<td><input type='submit' name='Button' value='Absenden' /></td>
</tr></table></center>
</form></div><br />";
}?>

Das ganze sieht so aus: http://www.designers-place.de/Test Version/index.php

Wie man schon sehen kann, möchte ich da wo alle News stehen unten immer ein Feld haben, wieviele Kommentare es dazu schon gibt. Ich habe ja 2 Tabellen. Eine News tabelle, in der jedem Eintrag eine id zugeordnet ist. Wenn man eine News anklickt, wird die URL ja mit dieser id erweitert. Wenn man dann einen Kommentar zur News schreibt, wird diese id auch in die Tabelle comment eingetragen, dass man die Kommentare der News zuordnen kann. Das heißt, ich habe in der comment tabelle mehrere Einträge mit der selben id.
Nun möchte ich, auf der index.php, wo alle News - Einträge stehen, diese Anzahl der gleichen id´s zu jedem News zählen. Nur wie mache ich das am Besten? Weil ich kann ja der Abfrage nicht eine eindeutige id zuordnen, da ich den angepassten Link mit der index.php?id=WERT noch nicht habe, den ich abrufen kann. Meine Idee, die ich hatte, das ich die id von den beiden Tabellen vergleiche, ist ja indem Sinne Schwachsinn, da er mir ja alle Einträge dadurch zählt.

Ich weiß echt nicht, wie ich es lösen soll. Vllt hat ja jemand von euch eine geniale Idee :)
Falls irgendetwas noch etwas unklar ist, einfach fragen.

Grüße
 
Hi,

Du solltest Dich dringend intensiver mit SQL beschäftigen. Bis jetzt verwendest Du nur simpelste Abfragen. Dadurch musst Du fast alles einzeln aus der Datenbank holen. Wenn die Datenmenge dann mal größere Dimensionen annimmt, geht Dir das schnell in die Knie.

Du kannst alle News inkl. der Anzahl der Kommentare mit einer Query abfragen:

Code:
SELECT *, COUNT(comments.id) AS anz_comments FROM news
   INNER JOIN comments
   ON news.id = comments.news_id
   GROUP BY news.id

LG
 
Ja, habe ich auch vor. Mir hat bisher nur die Zeit dazu gefehlt. Am Mittwoch schreibe ich meine letzte Arbeit in nächster Zeit, dann habe ich genügend Zeit :D

Verstehe jetzt nicht so ganz, für wo der Code ist? Zeigt der immer eine News + die dazugehörigen Kommentare an oder zählt der die Kommentare zu einer News?
 
Hi,

Verstehe jetzt nicht so ganz, für wo der Code ist? Zeigt der immer eine News + die dazugehörigen Kommentare an oder zählt der die Kommentare zu einer News?

Vielleicht probierst Du die Abfrage einfach mal in einem Client Deiner Wahl (z.B. phpMyAdmin) aus?
Du solltest übrigens noch aus dem INNER JOIN einen LEFT JOIN machen, sonst bekommst Du nur News, die auch schon Kommentare haben.

Lektüre für Dich: SelfHTML-Artikel zu Datenbanken

LG
 
ich habs jetzt so:
Code:
SELECT *, COUNT(comment.id) AS anz_comment FROM news
   LEFT JOIN comment
   ON news.id = comment.news_id
   GROUP BY news.id

Dann kommt in phpMyAdmin folgender Fehler: #1054 - Unknown column 'comment.news_id' in 'on clause'

Auf was bezieht sich das comment bei comment.news_id? Weil in der Tabelle news gibt es keinen Eintrag Namens comment.


EDIT: Habs nun geändert. So:
Code:
SELECT *, COUNT(comment.id) AS anz_comment FROM news
   LEFT JOIN comment
   ON news.id = comment.id
   GROUP BY news.id

phpMyAdmin gibt dann das aus:
id titel datum text idgb id name email url textnachricht datum uhr anz_comment
20 Designers Place ist er&ouml;ffnet. 1.1.2009 Endlich ist es soweit. Nach vielen Monaten Arbeit ... NULL NULL NULL NULL NULL NULL NULL NULL NULL 0
21 Neues Free Template Online. 5.1.2009 Designers Place ist inzwischen seit 5 Tagen online... NULL NULL NULL NULL NULL NULL NULL NULL NULL 0
23 Erster Monat vor&uuml;ber 2.2.2009 Designers-Place ist nun bereits 1 Monat online. Es... 14 23 rtz r ztr tzrtz = date( = date( 1
24 G&auml;stebuch erweitert 17.2.2009 Nachdem das G&auml;stebuch in letzter Zeit h&auml;... 8 24 679 867 67 67 = date( = date( 3
25 Designers Place sucht dich! 27.2.2009 Wir (Designers-Place) sind momentan auf der Suche ... 7 25 dsN in tes testtttt = date( = date( 4

So ist es ja perfekt, da er hinten bei anz_comment die Kommentare ja richtig zählt. Nur wie rufe ich diese jetzt ab?
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück