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来完成。也许您应该尝试将两个表连接起来,而不是将信息放在同一行上。