2012-12-15 8 views
5

Ich programmiere ein News-Update-System mit Kommentaren. Ich habe drei Tische.Wie lösche ich einzelne Zeilen von einem GROUP_CONCAT?

  1. news_tbl
  2. users_tbl (Autoren Neuigkeiten Beiträge)
  3. comments_tbl (mit einem Fremdschlüssel verbunden - news_id)

ich versucht habe zwei Methoden mit und ohne GROUP_CONCAT.

Ich habe dies versucht:

SELECT *, COUNT(comments_tbl.comments_id) AS `comments_count` 
FROM news_tbl AS n 
LEFT JOIN users_tbl AS u 
ON n.user = u.username 
LEFT JOIN comments_tbl AS c 
ON c.news_id = n.news_id 
GROUP BY n.news_id; 

Es funktioniert, aber ich kann den ersten schriftlichen Kommentar nur angezeigt werden, aber ich möchte alle Kommentare angezeigt wird, auf die Nachricht Update angebracht.

Ich habe auch GROUP_CONCAT für die Kommentare verwendet, so dass es keine Duplikate der Nachricht geben wird, für jeden der Kommentare. Ich bin mir nicht sicher, ob es die richtige Methode ist, aber es funktioniert.

Mein Problem ist, ich habe ein Login-System, und ich möchte der Benutzer in der Lage sein, die Kommentare einzeln löschen, mit einem Lösch-Taste für jeden von ihnen. Aber ich weiß nicht, wie ich die Kommentare einzeln trennen und die ID von jedem Kommentar holen soll. Ich habe es mit der PHP explode versucht, aber es hat nicht für mich funktioniert.

Dies ist mein Code:

<?php 
require_once('connect.inc.php'); 
$conn = dbConnect('pdo') or die('no connection'); 

$sqlquery = "SELECT news_tbl.*, users_tbl.*, 
GROUP_CONCAT(comments_tbl.comments_id) AS commentsid, 
GROUP_CONCAT(CONCAT ('<hr><h6>Navn: ', comments_tbl.name,'</h6>','<p>',comments_tbl.comment, '</p>') SEPARATOR '<br><br>') AS comments, 
COUNT(comments_tbl.comments_id) AS comments_count 
FROM news_tbl 
LEFT JOIN comments_tbl ON comments_tbl.news_id = news_tbl.news_id 
LEFT JOIN users_tbl ON news_tbl.user = users_tbl.username 
GROUP BY news_tbl.news_id 
ORDER BY news_tbl.news_id DESC LIMIT 5"; 

$result = $conn->query($sqlquery); 
foreach($result as $row) { 
    // AS 
    $commentsid = $row['commentsid']; 
    $comments = $row['comments']; 
    $count = $row['comments_count']; 

    //users_tbl 
    $username = $row['username']; 

    //news_tbl 
    $newsid = $row['news_id']; 
    $headline = $row['headline']; 
    $bodytext = $row['bodytext']; 
    $picture = $row['picture']; 
    $date = $row['date']; 

    //comments_tbl 
    $commentid = $row['comments_id']; 
    $name = $row['name']; 
    $comment = $row['comment']; 
?> 

    <div class="row-fluid"> 
    <div class="news"> 
     <div class="text-left"> 
     <h3 class="pull-top"><?php echo $headline ?></h3> 
      <div class="row-fluid span12"> 
      <img src="<?php echo 'upload/'.$picture ?>" class="span9 img-news"/> 
      </div> 
      <div class="row-fluid"> 
      <div class="span3"> 
       <p class="author"><i><span class="red">Skrevet af: </span> </i><?php echo $username ?></p> 
      </div> 
      <div class="span4"> 
       <p><i ><span class="red">Oprettet:</span> </i> <?php echo $date ?></p> 
      </div> 
      </div><!--/ End author-row --> 
     <!--<p class="author"><i><span class="red">Skrevet af: </span> </i><?php echo $username ?>&nbsp;&nbsp;|&nbsp;&nbsp;<i ><span class="red">Oprettet:</span> </i> <?php echo $date ?></p>--> 
     <p class="push-top-bottom"><?php echo $bodytext ?></p> 
     </div> 
     <hr> 
     <p class="text-left pull-top3"> <b><?php echo $count ?> kommentar</b></p> 
     <hr class="grey"> 
     <div class="row-fluid pull-top2"> 
     <div class="pull-left span12 text-left well"> 
      <?php echo $comments; ?> 
     </div> 
     <!-- Opret kommentar --> 
     <div class="row-fluid pull-left"> 
      <form action="insert.php?<?php echo 'news_id=' . $newsid; ?>" method="post" class="pull-left leave-comment"> 
      <input type="text" name="name" id="name" class="comment" placeholder="Navn" required/> <br> <br> 
      <textarea type="text" name="comment" id="comment" class="comment" placeholder="Skriv kommentar" rows="5" required></textarea> <br> <br> 
      <input type="submit" value="Opret kommentar" class="btn pull-left"/> 
      </form> 
     </div> 
     </div><!--/ End comments-row --> 
    </div><!--/ End news-container --> 
    </div><!--/ End news row --> 
<?php 
    if (isset($_SESSION['valid_user'])) { 
    // onClick slet nyhed med alert box 
    echo '<div class="row-fluid">'; 
    echo ' <div class="pull-left">'; 
    echo ' <a class="btn btn-danger" onclick="deleteNews('. $newsid.')" style="margin-right:20px;">Slet nyhed</a>'; 
    echo ' <a href=update.php?news_id='.$newsid.'&username='. $username .' class="btn btn-info">Updater nyhed</a>'; 
    echo ' <br><br><br><br>'; 
    echo ' </div>'; 
    echo '</div>'; 
    } 
?> 
    <hr> 
<?php 
    //End foreach 
} 
?> 
+3

Ich würde hier keine Gruppe verwenden, sondern nur die einzelnen Datensätze abrufen. Wie auch immer, wenn du es so willst: Warum nicht ein separates 'GROUP_CONCAT (comments_tbl.comments_id)'? – Wrikken

+0

Nun, wie würde ich es dann tun, ohne die GROUP_CONCAT? Ich habe verschiedene JOINS ausprobiert, aber ohne GROUP_CONCAT konnte ich nicht funktionieren, so dass ich alle Nachrichten und alle Kommentare anzeigen kann, ich würde nur einen Kommentar bekommen, oder Duplikate, und trotzdem hätte ich keine individuellen IDs bekommen Kommentare - um sie zu löschen. – user1906437

Antwort

0

wenn ich Recht Ihre Frage verstehe, können Sie GROUP_CONCAT (comments_tbl.comments_id) und ihr aktueller Group_concat() Inhalt als eine Spalte, so etwas wie:

GROUP_CONCAT(CONCAT(comments_tbl.comments_id,'|||','<hr><h6>Navn: ', comments_tbl.name,'</h6>','<p>',comments_tbl.comment, '</p>')) as something 

und dann in php

list($comment_id,$comment_content) = explode('|||',$row['something']); 
1

Die Funktion GROUP_CONCAT hat ein Limit für die Länge der resultierenden verketteten Zeichenfolge. Es ist sehr wahrscheinlich, dass Sie dieses Limit schnell erreichen, indem Sie versuchen, HTML oder möglicherweise lange Kommentare zu verketten.

Ich habe festgestellt, dass es besser ist, die erste Abfrage von der news.tbl auszuführen, und ein Array in PHP mit all den einzigartigen IDs von news.tbl zu erstellen. Führen Sie als Nächstes eine zweite Abfrage aus, um alle Kommentare für die Nachrichtensätze abzurufen. Zum Beispiel:

$sqlquery = "SELECT * FROM news_tbl LIMIT 10"; 

$result = $conn->query($sqlquery); 
$newsIds = array(); 
foreach($result as $row) { 
    $newsIds[] = $row['id']; 
} 
$sql = "SELECT * FROM comments_tbl WHERE news_id IN (".implode(', ', $newsIds).")"; 
$result2 = $conn->query($sql); 

// process each comment individually from $result2 
Verwandte Themen