Совет Mysqli, 1 или 2 запроса с возможно concat () - PullRequest
0 голосов
/ 23 декабря 2018

Спасибо, что уделили мне время на чтение.

У меня есть 2 таблицы users и config.

Таблица users в виде нескольких полей: id, client_id, site_id, имя пользователя, адрес электронной почты, пароль Из таблицы пользователей я получаю всех пользователей, у которых есть определенный идентификатор клиента, который передается через $ _SESSION, и он работает нормально, я получаю всех пользователей с определенного client_id

SELECT * FROM users WHERE client_id = '".$_SESSION['c_id']."'

Это возвращает пример с 2 пользователями:

++id++ ++client_id++ ++site_id++ ++username++ ++email++ ++password++
1        1             1,2         test1        1@1.com   pass
2        1             1           test2        2@1.com   pass

Из таблицы конфигурации мне нужно получить мету (разделенную запятую имени сайта) через site_id, переданный от пользователей, и через поле имени, которое определяет мету (s_name),Желаемый результат из этой таблицы - мета в 1 строке, возможно, с использованием concat ().Таблица конфигурации в виде нескольких полей:

++id++ ++client_id++ ++site_id++ ++name++ ++meta++
  1      1             1           s_name   Site 1 Name
  2      1             2           s_name   Site 2 Name

Конечным результатом будет таблица пользователей, заменяющая site_id на разделенное запятыми мета-поле таблицы конфигурации

++id++ ++client_id++ ++site_id++   ++username++ ++email++ ++password++
1        1             Site 1 name,  test1        1@1.com    pass
                       Site 2 Name 
2        1             Site 1 name   test2        2@1.com    pass

Приветствуются советы, должен ли я использовать 1 сложный запрос mysqli или 2 запроса с 2 циклами?

Пока я пытаюсь выполнить 2 запроса, я не могу получить второй запрос для объединения имени сайта через запятую:

$client_id_query = "SELECT * FROM user WHERE client_id = '".$_SESSION['c']."'";

$client_id_result = mysqli_query($hotelconnection->hotelconn,$client_id_query);

if(mysqli_num_rows($client_id_result) > 0){

while ($row_client_id = mysqli_fetch_array($client_id_result) ){

$explode_user_site_id = $row_client_id['site_id'];

$explode_user_site_id = explode(',', $explode_user_site_id);

foreach($explode_user_site_id as $unique_id){

$site_name_query = "SELECT GROUP_CONCAT(meta SEPARATOR ',') AS website_name FROM config WHERE name = 'website_name' AND client_id = '".$row_client_id['client_id']."' AND site_id = '".$unique_id."'";

$site_name_result = mysqli_query($hotelconnection->hotelconn,$site_name_query);

if(mysqli_num_rows($site_name_result) > 0){
while ($row_site_name = mysqli_fetch_array($site_name_result) ){

// Result is not concated in 1 row
++id++ ++client_id++ ++site_id++   ++username++ ++email++ ++password++
1        1             Site 1 name  test1        1@1.com    pass
1        1             Site 2 Name  test1        1@1.com    pass
2        1             Site 1 name  test2        2@1.com    pass

}
}
}
}
}

1 Ответ

0 голосов
/ 23 декабря 2018

Возможно, это не самое эффективное решение, но оно работает. Удаление site_id foreach, который создал 3 полных цикла и создание цикла конфигурации FIND_IN_SET. Side_ids приводит к тому, что для каждого пользователя в одной строке записывается разделение запятыми имен сайтов.

$site_name_query = SELECT GROUP_CONCAT(meta SEPARATOR ', ') AS website_name FROM config WHERE name = 'website_name' AND client_id = '".$row_client_id['client_id']."' AND FIND_IN_SET(site_id, '".$row_client_id['site_id']."')";
...