Как обрабатывать данные, полученные из объединенных операторов select

#php #mysql

#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:

При объединении двух таблиц либо поля обеих таблиц должны быть одинаковыми, либо псевдоним должен быть одинаковым для обеих таблиц.

Пожалуйста, попробуйте этот запрос.

 $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 или body или username . И вы сможете получить значение всех трех полей для выбранных записей.

Комментарии:

1. имя пользователя извлекается из другой таблицы с именем users

2. Хорошо, и есть ли какая-либо связь между таблицей blog и users?

3. Никакого отношения. Я хочу, чтобы пользователь мог искать и находить либо пользователей, либо сообщения в блоге. Я пытался добавить больше объединений, чтобы они могли найти и другие вещи, когда столкнулся с этой проблемой.

4. Для объединения имя поля таблицы должно быть одинаковым. Таким образом, в этом случае либо вам придется выполнять два отдельных запроса, либо псевдоним должен быть одинаковым для обеих таблиц. Например, проверьте обновленный запрос в ответе.