2011-08-25 75 views
0

我想在查询中连接2个表以显示结果。
我在第一个表中有lastname,firstname等。
在第二个表我有trainingdate ...mysql SELECT(需要连接到2个表格并显示搜索结果)

我也有第二个表的ID参考链接姓氏和名字,以培训和日期。
因此,只要我在数据库中创建培训记录,就会为同一个人使用相同的ID。
我希望能够连接我的查询中的两个表,并显示结果,如果我搜索lastname
它还会列出他们已完成的所有培训,如果我在搜索中点击该名称。
我很新的MySQL数据库。
我正在使用phpmyadmin的MySQL和运行本地主机数据库的测试目的...
我目前可以搜索一个表,并提出结果,但我无法弄清楚它们的联合,并将名称列表作为链接显示在那里培训。并让它保持在打印输出顶部的名称...这是我使用的代码,我从教程中获得。

<form> 
    <div align="right"> 
    <input type="button" value="Print Results" onClick="myprint()"> 
    </div> 
</form> 
<?php 

// TAKE THE INFORMATION FROM FORM. 
$search = $_GET['search']; 

// IF THERE IS NOT A KEYWORD GIVE AN ERROR 
if (!$search) 
echo "You didn't enter a keyword"; 
else 
{ 
    echo "<td>You searched for: <strong>$search </strong></td>"; 
    mysql_connect('localhost','loginid','password'); 
    mysql_select_db('trainingrecords'); 
    [email protected]$_GET['id']; 

    //QUERY IS THE CODE WHICH WILL MAKE THE SEARCH IN YOUR DATABASE. 
    //I WROTE AN EXPLANATION ABOUT IT AFTER THE CODE. 
    $query="SELECT * FROM username 
      WHERE MATCH(lastname, firstname, location, created) 
      AGAINST('%$search%' IN BOOLEAN MODE)"; 
    $result1 = MySQL_query($query); 
    if(!$result1) { 
    echo MySQL_error()."<br>$query<br>"; 
    } 
    if (MySQL_num_rows($result1) > 0) { 
    echo "<table width='750' align='center' border='1' 
      cellspacing='2' cellpadding='2'>"; 
    while($result2 = MySQL_fetch_array($result1)) { 

     //A short description from category. 
     $description = $result2['location']; 
     $searchPosition = strpos($description, $search); 
     $shortDescription = substr($description, $searchPosition, 150); 

     echo "<td><strong>{$result2['lastname']} 
      {$result2['firstname']}</td></strong><td> 
      $shortDescription</td><td>{$result2['created']}</td><tr/>"; 
    } 
    echo "</table>"; 
    } else { 
    echo "No Results were found in this category.<br>"; 
    } 
    echo "<br>"; 
} 
?> 

回答

1

1 - 你有一个SQL注入孔
确保使用mysql_real_escape_string
逃避所有的变量,并利用正确报价查询字符串里面_(否则mysql_real_escape_string将无法正常工作)_

$search = mysql_real_escape_string($GET['search']); 
.... 
$query="SELECT * FROM username 
     WHERE MATCH(lastname, firstname, location, created) 
     AGAINST('%".$search."%' IN BOOLEAN MODE)"; 
//   ^   ^quotes were already there, good! 

2 - 如果你想从多个表的结果,你就必须做一个连接

$search = "SELECT u.*, t.* FROM username u 
    INNER JOIN training t ON (u.id = t.user_id) 
    WHERE MATCH(lastname, firstname, location, created) 
     AGAINST('%".$search."%' IN BOOLEAN MODE)"; 

通常情况下,您不想选择所有字段,如果您明确声明要显示给用户的字段,查询将运行得更快。

这里的PHP和MySQL的一个体面的教程:http://www.tizag.com/mysqlTutorial/
而这里的,如果你有SQL注入孔时会发生什么:How does the SQL injection from the "Bobby Tables" XKCD comic work?

+0

感谢约翰这个伟大的工程!现在我唯一的问题是我的字符串搜索。当我搜索姓氏,并且如果有两个姓氏相同的人带来了他们两个,当我一起搜索姓氏姓氏。它似乎无视它,只是把两者都拉上来。我怎样才能让它在我的搜索中仅匹配名字和姓氏。而不仅仅是寻找并给我所有结果? – yeahwhatever

+0

我也无法按姓氏或我选择的方式排序搜索。有没有办法让我的桌子上的每个领域的标题,如果你点击它们,它们通过该领域命令他们?并且默认是姓氏? – yeahwhatever

1

我想你想是这样的:

SELECT * FROM username, training 
    where username.lastname = $lastname and username.firstname = $firstname 
     and username.id = training.id; 

这需要你在$lastname$firstname值作为独立变量传递。

1

它不是工会的加入你想

Select a.id,a.firstname,a.lastname,a.location,a.date,b.trainingdate 
from username a 
inner join 
training b on a.id=b.id 

添加您的地方在年底条款

0
-- something basic like this? 

SELECT u.id, u.name, t.link 
FROM users u 
LEFT JOIN trainings t ON u.id = t.user_id 
WHERE u.id = 5 
0

也许你想是这样的:

SELECT username.* FROM username 
JOIN training ON (training.id = username.id) 
WHERE MATCH(lastname, firstname, location, created)  
     AGAINST('%$search%' IN BOOLEAN MODE) 
1

你需要的是a JOIN

$query="SELECT * FROM username u LEFT JOIN training t on (t.userid = u.id) WHERE MATCH(lastname, firstname, location, created) AGAINST('%$search%' IN BOOLEAN MODE)";