Mysqli建议,使用concat()进行1或2个查询

时间:2018-12-23 11:37:02

标签: php mysqli concat

感谢您花时间阅读我的帖子。

我有2个表的用户和配置。

用户表为几个字段: id,client_id,site_id,用户名,电子邮件,密码 从用户表中,我获得了具有通过$ _SESSION传递的特定客户端ID的所有用户,并且工作正常,我从特定的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行中的meta,可以使用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 :(得分:0)

可能不是最有效的解决方案,但可以起作用。 删除每个站点的site_id会创建3个总循环,并使config循环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']."')";