php - 跨多个字段的搜索查询,包括 JOIN

标签 php mysql

简单地说,我想在我的数据库上运行搜索查询,但我对如何处理它有点迷失。

首先,搜索并不是一个供用户输入任何内容的开放文本字段,而是由三个设置字段的选择菜单和四个复选框组成。

选择菜单之一是职位类别(“catagory_id”),它由众多类别加上“所有职位”字段组成,该字段没有等效的数据库条目,但我认为如果选择该字段,将返回所有职位,无论类别如何但取决于接下来的两个选择字段(显然)。 但是,每个作业的类别(这是必填字段并且将始终完成)是使用 Toxi 解决方案按照以下数据库结构存储的,因为作业可以(并且鼓励)包含多个类别。 然后,从第一个选择菜单中,我可以将每个类别值指定为等于类别 ID。

CREATE TABLE `jobinfo` (
`job_id` INT NOT NULL AUTO_INCREMENT, 
`company_name` VARCHAR(50) NOT NULL, 
`job_title` TEXT NOT NULL, 
`url` VARCHAR(255) NOT NULL,
'country'  VARCHAR(50) NOT NULL,
'state'  VARCHAR(50) NOT NULL,
'city'  VARCHAR(50) NOT NULL,
'job_type'  VARCHAR(50) NOT NULL,
PRIMARY KEY (`job_id`)
)

CREATE TABLE `categories` (
`category_id` INT NOT NULL AUTO_INCREMENT, 
`category_name` VARCHAR(20) NOT NULL, 
PRIMARY KEY (`category_id`)
)

CREATE TABLE `tag_relational` (
`job_id` INT NOT NULL, 
`category_id` INT NOT NULL
)

第二个和第三个选择字段基于位置(国家和州/县)。这些稍微简单一些,只是存储在主 jobinfo 表中。但同样,我想要一个通用选项,因此如果用户选择美国作为国家/地区,则在州选择字段中,有一个选项可以查看美国的所有工作,或者按各个州进行钻取,并且显然将相同的逻辑应用于其他国家/地区.

(仅供引用,第三个选择字段在客户端填充,具体取决于第二个选择菜单中所做的选择 - 因此,如果用户在第二个字段中选择“英国”,则第三个选择字段将填充相应的县/地区。)

最后,我有四个与工作类型相关的复选框 - 永久、契约(Contract)、自由职业和远程工作。同样,这些是强制性选择,并作为字符串存储在主 jobinfo 表中。

因此,我希望查询返回所有职位或基于所选类别,特别是基于选择菜单二和三的地理位置,或者如果访问者选择“所有州”或“所有县”,则忽略选择第三列ETC。 另外,如果访问者没有选择四个复选框中的任何一个,我想返回所有列出的与前三个选择字段中的条件匹配的作业。

我的表单看起来像这样:

    <select name= "jobtype" id = "jc" title = "Hold down Ctrl to select">
            <option>JOB CATAGORY</option>
            <option value = "All Jobs">All Jobs</option>
            <option value = "1">Job Cat One</option>
            <option value = "2">Job Cat Two</option>
            <option value = "3">Job Cat Three</option>
            <option value = "4">Job Cat Four</option>
            <option value = "5">Job Cat Five</option>
            <option value = "6">Job Cat Six</option>

        </select>

        <select name="countries"  name = "country" onChange="updatecities(this.selectedIndex)">
            <option selected>REGION</option>
            <option value="usa">USA</option>
            <option value="canada">Canada</option>
            <option value="uk">United Kingdom</option>
            <option value="eu">European Union</option>
            <option value="rotw">Rest of the World</option>
        </select>

        <select name="cities">  <!--onClick="alert(this.options[this.options.selectedIndex].value)"-->
        </select>

    <ul>
    <li><input type = "checkbox" name = "cat[]" value = "Permanent"/></li><label>Permanent</label>
    <li><input type = "checkbox" name = "cat[]" value = "Cpntract"/></li><label>Contract</label>
    <li><input type = "checkbox" name = "cat[]" value = "Freelance"/></li><label>Freelance</label>
    <li><input type = "checkbox" name = "cat[]" value = "Telework"/></li><label>Telework</label>
    </ul>

    <input type="submit" value = "GO" />

我确实有一个查询(如下),用于根据通过复选框数组提交的类别返回结果,这要归功于之前关于SO的问题,但这有一点缺陷,因为它与类别选择完全匹配(即,如果列出了一个工作)在类别 1 和 4 中,并且您只搜索了 1,它不会返回结果),而且我现在已将位置添加到组合中:

$query = 
"SELECT j.*
FROM jobinfo j
JOIN tag_relational r
ON j.job_id=r.job_id
JOIN tags t
ON t.tag_id=r.tag_id
WHERE t.tag_id = $cat ORDER BY job_id DESC";

我很感激它很长,我希望有人有时间提供帮助。

一如既往地感谢, 丹

编辑:我可以根据所选内容在 if 语句中放置多个查询吗?例如:如果工作类型不为空且国家/地区不为空但城市为空,请为国家/地区选择匹配的工作类型,否则...?

最佳答案

您的问题并不完全清楚**,所以我做了以下假设:

假设:

  1. 你了解你的 JavaScript。即$_GET['cities']将始终包含有效/合法的城市名称。这个答案只是 PHP 和 MySql(就像问题的标签一样)。
  2. 当您说复选框是强制性的时,我认为您需要单选按钮。
  3. 当您谈论州时,您指的是城市,因为没有 <select>对于各州。
  4. 第一个<select>用于类别,checkboxes 单选按钮组用于 jobinfo.job_type
<小时/>

代码:

$legal_values['categories']=array(0=>'', 1=>'One', 2=>'Two', 3=>'Three', 4=>'Four', 5=>'Five', 6=>'Six');
$legal_values['countries']=array('usa'=> 'USA','canada'=>'Canada', 'uk'=>'United Kingdom', 
    'eu'=>'European Union', 'rotw'=>'Rest of the World');
$legal_values['term']=array(0 => 'Permanent', 1=> 'Contract', 2=>'Freelance', 3=>'Telework');

echo "<form action=\"{$_SERVER['PHP_SELF']}\" method=\"POST\">";
foreach($legal_values as $select_name => $legal_values)
{
    if($select_name=='term')
    {
        foreach($legal_values as $index => $val)
        {
            if(isset($_GET[$select_name]) && $_GET[$select_name]==$val)
            {
                $selected[$select_name]=$val;
                $isSelected=true;
            }
            else
            {
                $selected[$select_name]="";
                $isSelected=false;
            }
            echo "<label for=\"radio_{$index}\">{$val}</label>
            <input type=\"radio\" name=\"{$select_name}\" id=\"radio_{$index}\" value=\"{$val}\"" 
            .($isSelected?' selected="selected"':'').'>';
        }
    }
    else
    {
        $isCategories=$select_name=='categories'?true:false;
        echo '<select name="'.
            (($isCategories)?
            'jobtype" id = "jc" title = "Hold down Ctrl to select">
                <option>JOB CATAGORY'
            : 'countries" onChange="updatecities(this.selectedIndex)">
                <option>REGION')
            .'</option>';

        foreach($legal_values as $index => $val)
        {
            if(isset($_GET[$select_name]) && $_GET[$select_name]==$val)
            {
                $selected[$select_name]=$val;
                $isSelected=true;
            }
            else
            {
                $selected[$select_name]="";
                $isSelected=false;
            }
            echo "<option value = \"{$index}\" "
            .($isSelected?' selected="selected"':'')
            .">".($isCategories?'Job Cat':'')." {$val}</option>";
        }
        echo '</select>';

        echo '<select name="cities">  <!--onClick="alert(this.options[this.options.selectedIndex].value)"-->
        </select>';
    }
}
echo '<input type="submit" value = "GO" />
</form>';

$specific_cat=isset($selected['categories']) && $selected['categories']==0?true:false;
$specific_city=(isset($_GET['cities']) && $_GET['cities']==/*Whatever that first state option is for each country*/)?true:false;

$SQL_result = mysql_query('
SELECT DISTINCT jobinfo.* 
FROM jobinfo'
.($specific_cat?', categories, tag_relational ':'')
.'WHERE '.($specific_cat?"jobinfo.job_id=tag_relational.job_id
            AND tag_relational.category_id={$selected['categories']} AND ":'')
        .($specific_city?'jobinfo.city="'.mysql_real_escape_string($_GET['cities']).'" ':'')
."jobinfo.country=\"{$selected['countries']}\"
AND jobinfo.job_type=\"".mysql_real_escape_string($selected['term'])."\"
ORDER BY jobinfo.job_id DESC;");

//print table of jobs:
$NUM_jobs = mysql_num_rows($SQL_result);//courses to be displayed on this search results
$counter=0;
if($NUM_jobs>0)//if any courses match the search
{
    while($DB_ROW=mysql_fetch_assoc($SQL_result))//go through results by row
    {
        $counter++;
        if($counter==1)
        {
            echo '<table>
            <tr>
            <th>#</th>';
            foreach ($DB_ROW as $label => $val)
            {
                echo "<th>{$label}</th>";
            }
            echo '</tr>';
        }

        echo "<tr>
        <td>{$counter}</td>";
        foreach ($DB_ROW as $val)
        {
            echo "<td>{$val}</td>";
        }
        echo '</tr>';

        if($counter==$NUM_jobs)
        {
            echo '</table>';
        }
    }
    mysql_free_result($SQL_result);
}
//else: if nullset returned:
else{ echo '<p>Sorry, your search returned no results.</p>'; }
<小时/>

** 注意:

  • 另一件事,我建议将您的名称命名为 <select> s 并适合您的 SQL。在你的问题中你有一个 <select name="jobtype">对于名为 cat[] 的类别和复选框这是针对工作类型的。
  • 为什么有两个 name国家属性<select>

关于php - 跨多个字段的搜索查询,包括 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6700404/

相关文章:

mysql - MySQL 中的 double

php - 跨多个页面重用 session 变量

php - 赞成票/反对票系统

PHP+AJAX : How to make toggle for sorting data?

php - 为什么我的 SHA1 哈希值不匹配?

mysql - 我可以将 MySQL 表移动到第二个驱动器吗?

php - Composer : Huge vendor folder

javascript - Vue.js 选择特定值

mysql - SQL 计算所有行而不是计算单个行

mysql - 为什么会出现此 SQL 错误?