2012-12-15 10 views
5

Programuję system aktualizacji wiadomości z komentarzami. Mam trzy tabele.Jak usunąć pojedynczy wiersz z GROUP_CONCAT?

  1. news_tbl
  2. users_tbl (autorzy postów Aktualności)
  3. comments_tbl (związane jest z klucza obcego - news_id)

próbowałem dwa sposoby z, i bez GROUP_CONCAT.

Próbowałem to:

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; 

To działa, ale mogę tylko wyświetlenie pierwszego pisemnego komentarza, jednak chcę, aby wyświetlić wszystkie komentarze, dołączonych do aktualizacji prasowej.

Do komentowania użyłem także GROUP_CONCAT, więc nie będzie żadnych duplikatów wiadomości dla każdego z komentarzy. Nie jestem pewien, czy jest to właściwa metoda, ale działa.

Mój problem polega na tym, że mam system logowania i chcę, aby użytkownik mógł usuwać komentarze indywidualnie, z przyciskiem usuwania dla każdego z nich. Ale nie wiem, jak oddzielić komentarze indywidualnie i pobrać identyfikator z każdego komentarza. Próbowałem z PHP explode, ale to nie działa dla mnie.

To jest mój kod:

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

Nie używałbym tutaj grupy, ale po prostu pobieraj poszczególne rekordy. Jednakże, jeśli chcesz to w ten sposób: dlaczego nie zrobić osobnego 'GROUP_CONCAT (comments_tbl.comments_id)'? – Wrikken

+0

Cóż, jak mógłbym to zrobić, bez GROUP_CONCAT? Próbowałem różnych JOINS, ale nie mogłem go uruchomić bez GROUP_CONCAT, więc mogę wyświetlać wszystkie wiadomości i wszystkie załączone komentarze, otrzymam tylko jeden komentarz lub duplikaty, ale nadal nie mogę uzyskać pojedynczych identyfikatorów komentarze - do ich usuwania. – user1906437

Odpowiedz

0

czy zrozumiałem pytanie rację, można GROUP_CONCAT (comments_tbl.comments_id) i aktualna treść GROUP_CONCAT() jako jednej kolumnie, więc coś takiego:

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

i php

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

funkcja GRUPA_CONCAT ma limit czasu, w którym może powstać wynikowy łańcuch. Prawdopodobnie bardzo szybko osiągniesz ten limit, próbując połączyć HTML lub potencjalnie długie komentarze.

Znalazłem, że lepiej jest uruchomić pierwsze zapytanie z news_tbl i zbudować tablicę w PHP z wszystkimi unikalnymi identyfikatorami z news_tbl. Następnie uruchom drugie zapytanie, aby uzyskać wszystkie komentarze do rekordów wiadomości. Na przykład:

$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 
Powiązane problemy