2012-12-15 2 views
5

의견으로 뉴스 업데이트 시스템을 프로그래밍하고 있습니다. 나는 세 개의 테이블을 가지고있다.GROUP_CONCAT에서 개별 행을 삭제하는 방법은 무엇입니까?

  1. news_tbl
  2. users_tbl (뉴스 게시물의 저자)
  3. comments_tbl (외래 키와 연결되어 - news_id) 내가 함께 두 가지 방법을 시도

, 그리고없이 GROUP_CONCAT. 그러나, 나는 뉴스 업데이트에 부착 된 모든 의견을 표시 할,

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; 

그것은 작동하지만, 나는 첫 번째 기록 된 의견을 표시 할 수 있습니다

나는이 시도했다.

나는 또한 코멘트에 대해 GROUP_CONCAT을 사용 했으므로 각 코멘트에 대해 뉴스 게시물의 중복이 없습니다. 나는 그것이 올바른 방법인지는 모르겠지만 작동합니다.

내 문제는 로그인 시스템이있어서 사용자가 개별적으로 주석을 삭제할 수있게하고 각 사용자에 대해 삭제 버튼을 사용하기를 원합니다. 하지만 개별적으로 의견을 구분하는 방법을 알지 못하고 각 의견에서 ID를 가져옵니다. 나는 PHP의 explode을 시도했지만, 나에게 도움이되지 못했다. 그래서 뭔가 같은 내가 바로 당신의 질문을 이해하면

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

여기서 그룹을 사용하지 않고 개별 레코드를 가져옵니다. 그러나 이런 식으로 원한다면 : 왜 'GROUP_CONCAT (comments_tbl.comments_id)'를 별도로 만들지 않겠습니까? – Wrikken

+0

그럼 GROUP_CONCAT없이 어떻게 할 수 있습니까? 나는 다른 JOINS를 시도했지만 GROUP_CONCAT없이 작업 할 수는 없으므로 각 뉴스 및 첨부 된 모든 주석을 표시 할 수 있습니다. 단 하나의 주석이나 중복을 얻을 수 있으며 여전히 개별적으로 ID를 얻습니다. 주석 - 삭제를위한 것입니다. – user1906437

답변

0

, 당신이 GROUP_CONCAT 수 (comments_tbl.comments_id)와 하나 개의 컬럼으로 현재 GROUP_CONCAT() 내용 :

내 코드입니다

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

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

함수 GROUP_CONCAT에는 결과로 연결되는 문자열의 길이 제한이 있습니다. HTML 또는 긴 주석문을 연결할 때이 제한에 빨리 도달 할 가능성이 큽니다.

news_tbl에서 첫 번째 쿼리를 실행하고 news_tbl의 모든 고유 ID를 사용하여 PHP로 배열을 만드는 것이 더 효과적이라는 것을 발견했습니다. 그런 다음 두 번째 쿼리를 실행하여 뉴스 레코드에 대한 모든 주석을 가져옵니다. 예 :

$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 
관련 문제