如何处理从联合select语句接收的数据

时间:2016-10-10 06:34:33

标签: php mysql

您好我正在尝试为我的网站创建搜索功能。我有这个有查询的方法

public function search_all($data)
{
    $query = [];

    $result = $this->db->query('
        SELECT blog_title FROM blog WHERE blog_title LIKE "%'. $data . '%" 
        UNION
        SELECT body FROM blog WHERE body LIKE "%'. $data . '%" 
        UNION 
        SELECT username FROM users WHERE username LIKE "%'. $data . '%"
    ');

    while ($row = $result->fetch_assoc()) 
    {
        $query[] = $row;
    }

    $result->free();

    return $query;

    $mysqli->close();
}

然后我有处理用户输入的方法

public function search()
{
    if (isset($_POST['search']))
    {
        $search_term = trim($_POST['search_term']);

        $terms = $this->search->search_all($search_term);

        foreach ($terms as $term) 
        {
            var_dump($term);
        }
    }
}

搜索工作有点像。如果我搜索用户名或博客标题,那么我可以像这样回复它

echo $term['blog_title'];

如果我var_dump然后我得到类似

的东西
array (size=1)
    'blog_title' => string 'BillyBob' (length=8)

我的问题是为什么它总是以blog_title作为关键。我以为我必须做一些像

这样的事情

如果我想回应博客标题

echo $term['blog_title'];

如果我想回复用户名

echo $term['username'];

1 个答案:

答案 0 :(得分:3)

在两个表的并集中,两个表的字段应该相同,或者两个表的别名应该相同。

请尝试此查询。

$result = $this->db->query('
    SELECT body,blog_title,'' as username FROM blog WHERE blog_title LIKE "%'. $data . '%" OR body  LIKE "%'. $data . '%"  OR username  LIKE "%'. $data . '%"
    UNION 
    SELECT '' as body,'' as blog_title,username FROM users WHERE username LIKE "%'. $data . '%"
');

当搜索与blog_title或正文或用户名匹配时,此查询将选择记录。并且您将能够为获取的记录获取所有三个字段的值。