查询以在多个表中搜索+指定返回的值

时间:2013-05-12 16:49:55

标签: javascript sql postgresql extjs extjs4

我的原始查询是从文本字段中取一个术语,并开始在一个表的两列中搜索它[按顺序创建自动完成]

$query = $_GET['query'];      
$sql ="SELECT f_name, l_name FROM student WHERE (f_name ILIKE '%$query%' OR l_name ILIKE '%$query%');
$result = pg_query($con, $sql);
while ($row = pg_fetch_array($result))
           {  
            $names[] = array('f_name' => $row[0], 'l_name' => $row[1]);
           }

    $name_list = array();
    $name_list['success']       = true;
    $name_list['names']     = $names;


    $name_list['totalCount']    = count( $name_list['names'] );

echo json_encode($name_list);

不,我想从另一个表中添加额外的条件(例如:主题),因此用户可以输入学生名字,姓氏或主题的一部分。我还需要知道返回值的类型,我的意思是,如果这是一个名称或主题。所以我可以根据类型显示一个小图标。

这是模型,所以你可以想象我是怎么做的:

     Ext.define("Post", {
        extend: 'Ext.data.Model',
           proxy: {
         type: 'ajax',
        url: 'app/search.php',
        reader: {
            type: 'json',
            root: 'names',

        autoLoad: true,
            totalProperty: 'totalCount'
        }
    },

    fields: ['f_name','l_name'
, {
                    name : 'display',
                    convert : function(v, rec) {                        
                        return rec.get('f_name') + ',' + rec.get('l_name');
                    }
                }
    ]
    });

所以如果用户输入:mat 结果将是:

  

Mathio,Jay<<学生的名字和姓氏

     

Mark,Matt<<学生的名字和姓氏

我的更改之后应该是:

  

Mathio,Jay<<学生的名字和姓氏

     

Mark,Matt<<学生的名字和姓氏

     

数学<<受试者

1 个答案:

答案 0 :(得分:1)

您需要做的是调整原始查询以选择学生注册的主题(通过加入)

SELECT f_name, l_name, subj.name
FROM student stud
JOIN subjects subj on subj.stud_id=stud.stud_id
WHERE (f_name ILIKE '%$query%' OR l_name ILIKE '%$query%' 
                               OR subj.name ILIKE '%query%');

现在,您可能在学生和主题之间存在多重关系,因此您需要调整SQL代码以适应这种情况。如果您添加表格结构,有人可以跳入并告诉您如何进行所需的实际连接...

SELECT 'STUD' as theFlag,f_name, l_name, '' as SubjName
FROM student stud
WHERE (f_name ILIKE '%$query%' OR l_name ILIKE '%$query%')
UNION
SELECT 'SUBJ' as theFlag,'' as f_name,'' as l_name, subj.name as SubjName
FROM subject
WHERE (subj.name ILIKE '%query%');

现在,您将获得包含4列的记录。第一列表示来源,将是STUD或SUBJ。对于STUD记录,将填充名字和姓氏,并且SubjName字段将为空。对于SUBJ记录,名字和姓氏将为空白,但将填充SubjName ...

唯一需要注意的是,如果在两者中都找到了记录。为此,您需要决定要使用哪一个......