Php 在正确的位置输出查询结果

Php 在正确的位置输出查询结果,php,mysql,union,Php,Mysql,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,

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

"(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”表中的searchterm运行脚本时,没有问题。当我使用“video”表中的searchterm运行脚本时,仍然会得到结果,但它会将结果移动到循环的第一部分。这意味着我得到以下输出:

[{"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
,上传日期应为
2016-01-08

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

你的工会查询:

"(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\u id
first\u name
,以及
last\u name
type
)。它不会弹出名为
title
vimeo_id
upload
的字段,因为这些字段名在第二个查询中

基本上,在联合中,我们说的是两个select语句的结果集在字段方面是相同的。它总是使用第一个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语法关闭,请原谅。已经有一两年了,我已经生锈了。

难以置信,事实上就这么容易。。谢谢!当有疑问时,通过phpmyadmin或任何您不喜欢的mysql客户端运行您的查询。在数据库中处理更复杂的东西时,看到一个实际的结果集将非常有帮助。好吧,这就是我所做的,这让我明白了如何设置查询。但我不知道我怎么能像你展示的那样使用字体!谢谢刚刚注意到还有一个小问题。在else语句中插入了错误的字段。你能解释一下为什么我只能用$field['users\u id']而不是$fields['vimeo\u id']来获取值吗?因为在你的联合查询的结果集中只有4个字段。这4个字段由联合中的第一个查询命名。因此,您将在结果集的字段
users\u id
中找到从
video
表中选择的
vimeo\u id
的值。本质上,针对您的场景的联合查询有些不合适,但是!这是一个很好的解决方案,可以满足您的需要,您需要用一个查询搜索两个不相关的表。也许,为了清楚起见,可以将您的第一个查询更改为
selectusers\u id为uid\u或\u vid,first\u name为fn\u或\u vidTitle,等等
,这样结果集才有意义。对我来说,这个查询很奇怪,因为两个SELECT查询没有返回相同的列,因此应该使用UNION来完成。也许您应该尝试将两个表连接起来,而不是将信息放在同一行上。