在正确的地方输出查询结果

Outputting query results on the right place

我已经根据 this 问题设置了以下查询:

"(SELECT users_id, first_name, last_name, 'msg' as type FROM users 
 WHERE users_id LIKE '%" . $searchQuery ."%' 
 OR first_name LIKE '%" . $searchQuery ."%' 
 OR last_name LIKE '%" . $searchQuery ."%') 
 UNION
 (SELECT title, vimeo_id, upload_date, 'topic' as type FROM video 
 WHERE title LIKE '%" . $searchQuery ."%' 
 OR vimeo_id LIKE '%" . $searchQuery ."%')"

执行查询后,它应该吐出这样的结果:

foreach($row as $field) {
    $details[] = array(
        // Fields uit de users table
        'user_id'       =>  $field['users_id'],
        'first_name'    =>  $field['first_name'],
        'last_name'     =>  $field['last_name'],
        //Fields uit de video table
        'vimeo_id'      =>  $field['vimeo_id'],
        'video_title'   =>  $field['title'],
        'upload_date'   =>  $field['upload_date']
    );
}

有效,但我仍然遇到问题。当我 运行 带有应该在 'user' table 内的搜索词的脚本时没有问题。当我 运行 带有应该在 'video' table 内的搜索词的脚本时,我仍然得到结果,但它会将结果移动到循环的第一部分。这意味着我得到以下输出:

[{"user_id":"Test","first_name":"151125560","last_name":"2016-01-08 10:49:32","vimeo_id":null,"video_title":null,"upload_date":null}]

视频 ID 应为 151125560,视频标题应为 test,upload_date 应为 2016-01-08

我试图通过添加 as type 来解决这个问题,但我不知道如何从这里开始。有人可以帮助我将结果移动到正确的字段吗?

您的 UNION 查询:

"(SELECT users_id, first_name, last_name, 'msg' as type FROM users 
 WHERE users_id LIKE '%" . $searchQuery ."%' 
 OR first_name LIKE '%" . $searchQuery ."%' 
 OR last_name LIKE '%" . $searchQuery ."%') 
 UNION
 (SELECT title, vimeo_id, upload_date, 'topic' as type FROM video 
 WHERE title LIKE '%" . $searchQuery ."%' 
 OR vimeo_id LIKE '%" . $searchQuery ."%')"

要吐出四个字段(users_idfirst_namelast_nametype)。它不会吐出名为 titlevimeo_idupload 的字段,因为这些字段名称在第二个查询中。

基本上在 UNION 中,我们说两个 select 语句的结果集是相同的 field-wise。并且它始终使用第一个 SELECT 语句中指定的字段名称。

所以你应该这样做:

foreach($row as $field) {
    $details[] = array(
        // Fields uit de users table
        'user_id'       =>  $field['users_id'],
        'first_name'    =>  $field['first_name'],
        'last_name'     =>  $field['last_name'],
     );
}

并且期望结果始终在这些字段中(因为它们是)。

相反,您可以这样做:

foreach($row as $field) {
    if $field['type'] == 'topic'
    {
        $details[] = array(
            // Fields uit de users table
            'user_id'       =>  $field['users_id'],
            'first_name'    =>  $field['first_name'],
            'last_name'     =>  $field['last_name'],
            //Fields uit de video table
            'vimeo_id'      =>  '',
            'video_title'   =>  '',
            'upload_date'   =>  ''
        );

    } else {
        $details[] = array(
            // Fields uit de users table
            'user_id'       =>  '',
            'first_name'    =>  '',
            'last_name'     =>  '',
            //Fields uit de video table
            'vimeo_id'      =>  $field['users_id'],
            'video_title'   =>  $field['first_name'],
            'upload_date'   =>  $field['last_name']
        );
    }

}

如果我的 php 语法不正确,请原谅我。一两年了,生疏了