2015-07-10 22 views
6

Gần đây tôi đã hỏi một câu hỏi tương tự về vấn đề này khoảng hai tuần trước, nhưng tôi đã không tìm cách giải quyết vấn đề của mình theo cách tôi cần.Tại sao truy vấn của tôi trả lại kết quả không chính xác?

Tôi có truy vấn đang chọn từ 2 bảng; vé và trả lời. Tôi đang chọn thông tin từ bảng vé, và tôi đang chọn thông tin từ bảng trả lời có id vé được lưu trữ trong đó. Mà bây giờ nói đến vấn đề của tôi.

Truy vấn của tôi chỉ hiển thị các vé có nhiều hơn 0 trả lời, nhưng tôi cần nó để hiển thị thông tin vé ngay cả khi nó không có bất kỳ câu trả lời nào.

Tôi muốn biết (nếu có thể) nếu có cách nào để khắc phục sự cố của tôi và nếu có cách làm đơn giản hơn tôi hiện có.

Hiện tại có một chút lộn xộn, nhưng đây là mã của tôi để truy vấn và hiển thị vé và trả lời.

if(isset($_GET['id']) && is_numeric($_GET['id'])) { 
    $id = trim($_GET['id']); 
    $i = ""; 

    $ticket = $db->conn->query(" 
           SELECT * FROM tickets 
           INNER JOIN replies ON tickets.id = '$id'") or die(mysqli_error($db->conn)); 

    while($rows = $ticket->fetch_assoc()) { 
     $i++; 
     if($_SESSION['ticket_username'] == $rows['client']) { 
      if($i <= 1) { 
       $status = $rows['status']; 
       echo ' 
        <h3>'.$rows['subject'].'</h3><hr> 

        <div class="panel panel-danger"> 
        <div class="panel-heading"> 
         <h3 class="panel-title"><small>Created by '.$rows['client'].', '.$timeAgo->inWords($rows['created_at']).'</small></h3> 
        </div> 
        <div class="panel-body">'.nl2br($rows['message']).'</div> 
        </div> 
       '; 
      } 

      echo ' 
       <div class="panel panel-info"> 
        <div class="panel-heading"> 
         <h3 class="panel-title"><small>Reply from '.$rows['reply_username'].', '.$timeAgo->inWords($rows['reply_time']).'</small></h3> 
        </div> 
        <div class="panel-body">'.nl2br($rows['reply_message']).'</div> 
        </div> 
       '; 

     } else { 
      header("Location: index"); 
     } 
    } 
} else { 
    header("Location: index"); 
} 
+0

Bạn có thể giải quyết đơn giản bằng cách chia các truy vấn. Đầu tiên lấy tất cả các vé. Vòng qua vé và tìm tất cả các trả lời cho mỗi vé. – Peter

+0

Tôi đã làm một cái gì đó tương tự như trên một dự án trước đó, nhưng tôi muốn kết hợp nó thành một truy vấn lần này. – Jon

Trả lời

14

Thay đổi truy vấn.

Sử dụng một LEFT JOIN thay vì một Giải thích INNER JOIN

$ticket = $db->conn->query("SELECT * FROM tickets 
LEFT JOIN replies ON tickets.id = '$id'") or die(mysqli_error($db->conn)); 

enter image description here

:

  1. Inner Join trả về chỉ những giá trị cho cả các bảng có được trận đấu . Đây là một loại giao điểm của hai vòng tròn.
  2. Tham gia trái trả về tất cả các hàng từ bảng bên trái không phân biệt về việc liệu nó có bất kỳ kết quả phù hợp nào trên bảng bên phải hay không.

Trong trường hợp của bạn, nếu bạn sử dụng tham gia bên trong, nó chỉ trả lại những vé có trả lời.

Hình ảnh Được giới thiệu từ here

+0

Tôi đã sử dụng LEFT JOIN trong lần thử trước, nhưng có cùng kết quả. Chỉ cần thay đổi nó thành một LEFT JOIN bây giờ và thêm một mệnh đề WHERE và nhận được kết quả mà tôi sau. Cảm ơn bạn. – Jon

Các vấn đề liên quan