2012-12-15 13 views
5

Sto programmando un sistema di aggiornamento di notizie con commenti. Ho tre tavoli.Come eliminare una singola riga da un GROUP_CONCAT?

  1. news_tbl
  2. users_tbl (autori di messaggi di notizie)
  3. comments_tbl (è collegato con una chiave esterna - news_id)

Ho provato due metodi con e senza GROUP_CONCAT.

Ho provato questo:

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; 

Funziona, ma posso visualizzare solo il primo commento scritto, però, voglio visualizzare tutti i commenti, attaccati alla news update.

Ho anche utilizzato GROUP_CONCAT per i commenti, quindi non ci saranno duplicati del post di notizie, per ciascuno dei commenti. Non sono sicuro se sia il metodo giusto, ma funziona.

Il mio problema è che ho un sistema di accesso e voglio che l'utente sia in grado di cancellare i commenti individualmente, con un pulsante di cancellazione per ognuno di essi. Ma non so come separare i commenti individualmente, e recuperare l'id da ogni commento. Ho provato con il PHP explode, ma non ha funzionato per me.

Questo è il mio codice:

<?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

Non vorrei utilizzare un gruppo qui, ma solo recuperare i singoli record. Tuttavia, se lo vuoi in questo modo: perché non fare un "GROUP_CONCAT" (comments_tbl.comments_id) separato? – Wrikken

+0

Bene, come lo farei allora, senza il GROUP_CONCAT? Ho provato diversi JOIN, ma non riuscivo a farlo funzionare senza il GROUP_CONCAT, quindi posso visualizzare ogni notizia e tutti i commenti allegati, vorrei solo ottenere un commento, o duplicati, e comunque non ottengo id individuali del commenti - per eliminarli. – user1906437

risposta

0

se ho capito la tua domanda giusta, si può group_concat (comments_tbl.comments_id) e il contenuto corrente group_concat() come una colonna, in modo da qualcosa come:

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

e poi in php

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

La funzione GROUP_CONCAT ha un limite per quanto tempo può essere la stringa concatenata risultante. È molto probabile raggiungere rapidamente questo limite tentando di concatenare HTML o potenzialmente lunghi commenti.

Ho trovato che è meglio eseguire la prima query da news_tbl e creare un array in PHP con tutti gli ID univoci di news_tbl. Quindi, eseguire una seconda query per ottenere tutti i commenti per i record di notizie. Ad esempio:

$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 
Problemi correlati