2011-07-04 11 views
28

yo tenemos tres tablas en mi base de datos que son:PHP MySQL de búsqueda múltiples tablas utilizando una palabra clave

messages 
topics 
comments 

Cada una de estas tablas tiene dos campos llamados 'contenido' y 'título'. Quiero poder utilizar 'Me gusta' en mi declaración sql para ver 'messages.content', 'messages.title', 'topics.content', 'topics.title', 'comments.content' y 'comments. título 'usando una palabra clave.

Hasta ahora, mi consulta es capaz de encontrar los resultados de una sola tabla:

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

También me pregunto, una vez que consiga los resultados de varias tablas, ¿cómo puedo saber qué resultado es de lo que la tabla ?

¡Cualquier ayuda sería muy apreciada!

+1

¿Hay alguna razón por la que no solo estés haciendo 3 consultas diferentes? Las columnas probablemente no son las mismas en todos ellos. – evan

+0

La búsqueda de texto completo (FTS) es el enfoque recomendado: [MySQL tiene sintaxis nativa, pero solo para MyISAM] (http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html). De lo contrario, debe buscar soporte de terceros, como Sphinx. –

Respuesta

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); 

Por lo tanto, usted está consiguiendo resultado de todas las tres tablas, y se puede identificar qué fila vino de mesa, que mirando a su valor type.

+0

Definitivamente la respuesta correcta. ¡Gracias! el enfoque tipo fue exactamente lo que necesitaba. –

+0

Usado esta consulta funciona perfecto, lo único es ¿por qué no puedo agregar otro campo como "SELECCIONAR contenido, título, nombre de usuario"? cuando lo hago, recibo un error de servidor 500. ¿Tienes alguna idea? ¡Gracias por adelantado! –

+0

@FrankW .: Hola Frank, lamento que no haya notado tu comentario anterior. Espero que hayas resuelto tu problema? –

2

Dos de búsqueda en otras tablas que utilice:

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

Los CATEGORÍAS y PUESTOS son tablas de su base de datos.

+1

No es exactamente lo que estaba buscando. ¡Gracias por la respuesta! –

+0

¡devolverá valores duplicados! –

6

Lo que probablemente está buscando es el comando 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 is the application database connection –

+0

¿Elaboraría su respuesta? – Hatef

1

HTML formulario de búsqueda:

<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"; 
    } 

incluyen base de datos. php en 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(); 
Cuestiones relacionadas