2011-07-04 48 views
28

tôi có ba bảng trong cơ sở dữ liệu của tôi đó là:PHP tìm kiếm mysql nhiều bảng bằng cách sử dụng từ khóa

messages 
topics 
comments 

Mỗi bảng có hai lĩnh vực được gọi là 'nội dung' và 'tiêu đề'. Tôi muốn có thể sử dụng 'Like' trong câu lệnh sql của tôi để xem 'messages.content', 'messages.title', 'topics.content', 'topics.title', 'comments.content' và 'comments. tiêu đề 'bằng cách sử dụng một từ khóa.

Cho đến nay, câu hỏi của tôi là có thể tìm thấy kết quả chỉ từ một bảng:

mysql_query("SELECT * FROM messages 
WHERE content LIKE '%" . $keyword . "%' 
OR title LIKE '%" . $keyword ."%'"); 

Tôi cũng tự hỏi, một lần tôi nhận được kết quả từ nhiều bảng, làm thế nào tôi có thể nói những gì kết quả là từ những gì bảng ?

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều!

+1

Có lý do nào khiến bạn không chỉ thực hiện 3 truy vấn khác nhau không? Các cột có thể không giống nhau trên tất cả các cột. – evan

+0

Tìm kiếm văn bản đầy đủ (FTS) là phương pháp được khuyến nghị - [MySQL có cú pháp riêng, nhưng nó chỉ dành cho MyISAM] (http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html). Nếu không, bạn phải tìm đến sự hỗ trợ của bên thứ 3, như Sphinx. –

Trả lời

73
$query = "(SELECT content, title, 'msg' as type FROM messages WHERE content LIKE '%" . 
      $keyword . "%' OR title LIKE '%" . $keyword ."%') 
      UNION 
      (SELECT content, title, 'topic' as type FROM topics WHERE content LIKE '%" . 
      $keyword . "%' OR title LIKE '%" . $keyword ."%') 
      UNION 
      (SELECT content, title, 'comment' as type FROM comments WHERE content LIKE '%" . 
      $keyword . "%' OR title LIKE '%" . $keyword ."%')"; 

mysql_query($query); 

Vì vậy, bạn đang nhận được kết quả từ tất cả các ba bảng, và bạn có thể xác định được hàng đến từ đó bảng bằng cách nhìn vào giá trị type của nó.

+0

Chắc chắn là câu trả lời đúng. Cảm ơn! cách tiếp cận kiểu là chính xác những gì tôi cần. –

+0

Sử dụng truy vấn này hoạt động hoàn hảo, điều duy nhất là tại sao tôi không thể thêm một trường khác như "SELECT nội dung, tiêu đề, tên người dùng"? khi tôi làm điều đó tôi nhận được một lỗi máy chủ 500. Bạn có bất kỳ ý tưởng? Cảm ơn trước! –

+0

@FrankW .: Xin chào Frank, xin lỗi vì tôi không nhận thấy bình luận của bạn trước đó. Tôi hy vọng bạn đã giải quyết được vấn đề của mình? –

2

Hai tìm kiếm trong các bảng khác bạn sử dụng:

SELECT `categories`.`title`, `posts`.`title` WHERE `categories`.`title` LIKE {$a} OR `posts`.`title` LIKE {$a} 

Các LOẠIPOSTS là bảng của cơ sở dữ liệu của bạn.

+1

Không hoàn toàn là những gì tôi đang tìm kiếm. Cảm ơn bạn cho câu trả lời mặc dù! –

+0

nó sẽ trả về giá trị trùng lặp! –

6

Những gì bạn có thể tìm cho là lệnh UNION:

SELECT id, 'messages' as 'table' FROM messages 
WHERE content LIKE '%keyword%' 
OR title LIKE '%keyword%' 
UNION 
SELECT id, 'topics' as 'table' FROM topics 
WHERE content LIKE '%keyword%' 
OR title LIKE '%keyword%' 
UNION 
SELECT id, 'comments' as 'table' FROM comments 
WHERE content LIKE '%keyword%' 
OR title LIKE '%keyword%' 
-1
class Database{ 
    public function select($query){ 
      $result = $this->link->query($query) or die($this->link->error.__LINE__); 
      if($result->num_rows > 0){ 
       return $result; 
      } else { 
       return false; 
      } 
     } 
    } 
    $db = new Database(); 
    $query = "SELECT * FROM post WHERE title LIKE '%$search%' OR body LIKE '%$search%'"; 
    $post = $db->select($query); 
    if ($post) { 
    while ($result = $post->fetch_assoc()) { 
echo"Database Table colum" 
} else{ 
echo "Search result not Match"; 
} 
} 
+0

$ this-> link là kết nối cơ sở dữ liệu ứng dụng –

+0

Bạn có thể xây dựng câu trả lời của mình không? – Hatef

1

Html hình thức tìm kiếm:

<div class="header_top_right"> 
    <form action="search.php" method="GET" class="search_form"> 
     <input type="text" placeholder="Text to Search.." name="search"> 
     <input type="submit" class="btn btn-default" value=""> 
    </form> 
</div> 

Search.php:

<?php 
    if (isset($_GET['search']) || !empty($_GET['search'])) { 
     $search = mysqli_real_escape_string($db->link, $fm->validation($_GET['search'])); 
    } 
    else{ 
     header("Location:404.php"); 
    } 
?> 
<?php 
    $query = "SELECT * FROM news_post WHERE title LIKE '%$search%' OR body LIKE '%$search%' OR tags LIKE '%search%'"; 
    $post = $db->select($query); 
    if ($post) { 
     while ($result = $post->fetch_assoc()) { 
      echo"Database data like, $result['title']"; 
     } 
    } 
    else{ 
     echo "result Not found"; 
    } 

bao gồm cơ sở dữ liệu. php trong search.php

class Database{ 
    public function select($query){ 
     $result = $this->link->query($query) or die($this->link->error.__LINE__); 
     if($result->num_rows > 0){ 
      return $result; 
     } 
     else { 
      return false; 
     } 
    } 
} 
$db = new Database(); 
Các vấn đề liên quan