多对多关系-将数据从多个表移动到单个表

时间:2018-12-31 15:59:29

标签: php mysql sql

我有一个带有用户的表,一个带有标签的表 一个标签可以有多个用户,一个用户可以有多个标签,因此“多对多”关系 需要一个联接表,这就是为什么我有label_user

在下面您可以看到示例数据中包含的图片:

用户:

https://i.stack.imgur.com/E5E6O.png

标签:

https://i.stack.imgur.com/1NFjq.png

label_user:

https://i.stack.imgur.com/tW2Uo.png

假设我有5000个用户,并且可以按性别对其进行排序。假设其中有2800个是男性,如何将它们全部分配给标签?

这是我尝试过的一些事情:

public function add_users_to_label($label_id, $condition, $value)
{
    $db = new Database();

    $conn = $db->db_connect();

    $label_id = escape_string($conn, $label_id);

        $query = $conn->query("INSERT INTO `label_user`(`label_id`, `user_id`) SELECT :label_id, psid FROM `iris_messenger_users` WHERE $condition = $value");

        $query->bind_param("iss", $label_id, $condition, $value);

        if ($query->execute()) {
            return true;
        }
        else {
            return "Error inserting data: " . $conn->error . "\n";
        }

}

在用户端,我有一个带有select的简单表单,让我们选择标签,然后选择此代码:

if(isset($_POST['label-select'])) {

if ($_GET['show_only_gender'] == 'male') {
    $condition = 'gender';

    $user->add_users_to_label($_POST['label-select'], $condition, $_GET['show_only_gender']);
}

}

基本上,我想获取所有男性用户,并将其分配给标签,然后分别将label_id和user_id(psid)放入label_user

即使这行得通,我仍然必须做2699次以上。如果可以的话,我在这里可以做些优化来使其运行1个查询? 我认为使用foreach并在有用户的情况下运行它不是最好的选择,是吗?

有什么更好的方法可以实现这一目标?

1 个答案:

答案 0 :(得分:0)

尽管您所描述的内容与该特定组件的人相关联的“标签”没有意义,但用户表中已经存在性别,您应该能够基于此获得所有男性

在性别='男性'的用户中选择*

无需在此字段上加入标签表。同样,如果您试图根据以某事开头的名字来寻找人,那么您也不会为该名字创建标签。直接从具有特定组件关联的表中查询。

现在,要回答您的问题,如何将每个实例批量插入标签表中,您可以执行以下操作...我正在基于某些标签ID = 123进行此操作,仅作为标签表中的示例代表性别。

我在选择中进行了LEFT-JOIN操作,因此我们不会尝试为已在文件中的任何用户ID添加,请勿尝试重新添加。

insert into label_user
  ( label_id,
    user_id )
  select 
         123 as label_id, 
         U.id as user_id
      from
         users U
            left join label_user LU
               on U.id = LU.user_id
               AND LU.label_id = 123
      where
             U.gender = 'male'
         AND LU.user_id IS NULL

您显然需要调整php。