2016-05-29 32 views
2

現在、私はここに2データベーステーブルから選択して40のコンテンツを制限する方法は?

chatroom_id | chat_id | 
1    1  

は私chatroom_chatとして、私はチャットなどのコンテンツ

テーブル名を2テーブルIDを選択して、ショーを制限したい3つのテーブル

id | user_id | chat | date 
1  1   a  2016-05-29 12:02:58 

テーブル名をあるきSQL文を使用したPHPコード

 $chatroomID=$_GET['chatroomID']; 
$userID = $_SESSION['id']; 

$sql="SELECT * FROM chatroom_chat WHERE chatroom_id ='$chatroomID'"; 
$result1 = mysqli_query($connection, $sql) or die(mysqli_error($connection)); 

    while ($row = mysqli_fetch_array($result1)) { 
    $chat = $row['chat_id']; 

    $sql3 ="SELECT * FROM (
       SELECT * FROM chat,chatroom_chat WHERE id = '$chat' AND chat_id= '$chat' ORDER BY id DESC LIMIT 0,40 
       ) sub 
       ORDER BY id ASC LMIT 0,40"; 

    $getChatData = mysqli_query($connection,$sql3) or die(mysqli_error($connection)); 

    $getUserID=mysqli_query($connection, "SELECT * FROM chat WHERE id = '$chat'") or die(mysqli_error($connection)); 

    while($getUserIDRow=mysqli_fetch_array($getUserID)){ 
     $postUserID=($getUserIDRow['user_id']); 
    } 

    $getUsername=mysqli_query($connection, "SELECT * FROM user WHERE id = '$postUserID'"); 
    while($getUsernameRow=mysqli_fetch_array($getUsername)){ 
     $postUsername=($getUsernameRow['username']); 
    } 

    while($row3 = mysqli_fetch_array($getChatData)) { 
     $color = ($row3['user_id'] == $userID) ? '#FFFFFF' : '#66FFFF'; 
     $position = ($row3['user_id'] == $userID) ? 'right' : 'left'; 
     $border = ($row3['user_id'] == $userID) ? ' 1px solid black ' : ' none '; 

     echo "<div class='msg-dateandtime' style='text-align:$position; float:$position;'> <div class='left-username' style='color:blue;'>" .$postUsername."</div>" 
       . "<div class='space'></div>" 
       . "<div class='right-date'> ". $row3['date'] ." </div></div>" 
       . "<div class='wrap-message' style='background-color:$color; border:$border; float:$position;'>" 
       . "<p style 'text-align=$position; margin:0; padding:0; text-align:left;'> ".$row3['chat']."</p></div>"; 
    } 

} 

今すぐここにエラーが表示されることはありません。ちょうどチャットは40でショーを制限することはありません。

+0

'ORDER BY id ASC'の隣に' LIMIT 40'を追加するとどうなりますか? –

+0

エラー「あなたはSQL構文にエラーがあります。 MariaDBサーバーのバージョンに対応するマニュアルをチェックして正しい構文を確認し、 'LMIT 0,40'の4行目近くで使用してください。 – Chew

+0

派生テーブルごとにエイリアスを使用していることを確認してください。たとえば、 'id'ではなく 'chat.id'の場合クエリの可読性も向上します – sabith

答えて

2

おそらく、あなたは結合クエリを使いたいと思っています。

また、whileループのコードから推測できることは、同じテーブルで他のmysqlクエリを実行していることです。 は、結果がchat.id = chatroom_chat.chat_id

ポストそれがさらに最適化することができるように完全なコードを持つテーブルをfromthe選択します

$sql3 ="SELECT * FROM (
SELECT * FROM chat LEFT JOIN chatroom_chat ON chat.id = chatroom_chat.chat_id WHERE id = $chat ORDER BY id DESC LIMIT 0, 40 
) sub 
ORDER BY id ASC"; 

このようクエリを使用してください。 お手伝いをしてください。

@Chew ..ここでは完全なコードを使用します。ちょうどあなたがインナーは、上記のように参加使って短いクエリを書くことができる必要

$chatroomID=$_GET['chatroomID']; 
$userID = $_SESSION['id']; 

    //This will select all the chats from table chat with id corresponding to that of chat_id in chatroom_chat table 
    $sql3 ="SELECT * FROM (
      SELECT * FROM chat LEFT JOIN chatroom_chat ON chat.id = chatroom_chat.chat_id WHERE chatroom_id = $chatroomID ORDER BY id DESC LIMIT 0, 40 
     ) sub 
     ORDER BY id ASC"; 
    $getChatData = mysqli_query($connection,$sql3) or die(mysqli_error($connection)); 

    $chatData = array(); 
    $user_ids = ''; 
    while($getRowChatData=mysqli_fetch_assoc($getChatData)){ 
     $chatData[]= $getRowChatData; 
     $user_ids .= $getRowChatData['user_id']+','; 
    } 

    $users = array(); 
    $getUsername=mysqli_query($connection, "SELECT * FROM user WHERE id IN ($user_ids); 
    while($getUsernameRow=mysqli_fetch_assoc($getUsername)){ 
     $users[(string)$getUsernameRow['id']] = $getUsernameRow['username']; 
    } 

    for($i = 0; $i < count($chatData); $i++) { 

     $color = ($chatData['user_id'] == $userID) ? '#FFFFFF' : '#66FFFF'; 
     $position = ($chatData['user_id'] == $userID) ? 'right' : 'left'; 
     $border = ($chatData['user_id'] == $userID) ? ' 1px solid black ' : ' none '; 

     echo "<div class='msg-dateandtime' style='text-align:$position; float:$position;'> <div class='left-username' style='color:blue;'>" .$users[$chatData['user_id']]."</div>" 
       . "<div class='space'></div>" 
       . "<div class='right-date'> ". $chatData['date'] ." </div></div>" 
       . "<div class='wrap-message' style='background-color:$color; border:$border; float:$position;'>" 
       . "<p style 'text-align=$position; margin:0; padding:0; text-align:left;'> ".$chatData['chat']."</p></div>"; 
    } 

} 
+0

私は全体のコードを更新しました – Chew

+0

tq非常に私はアイデアを得る – Chew

2
SELECT * FROM chat INNER JOIN chatroom_chat ON 
chat.id=chatroom_chat.chat_id WHERE chat.id='$chat' ORDER BY id DESC LIMIT 40; 

などのパラメータと文字列を検証します。それはまた、理解しやすいです。 40行のみを取得するには、指定する必要があるのはLIMIT 40です。

関連する問題