问题:多表查询+指定返回值

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

$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 << 学生的名字和姓氏

数学 << 科目

解答

您需要做的是调整您的原始查询以获取学生注册的主题(通过连接)

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...

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

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐