我有一个带有用户的表,一个带有标签的表 一个标签可以有多个用户,一个用户可以有多个标签,因此“多对多”关系 需要一个联接表,这就是为什么我有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并在有用户的情况下运行它不是最好的选择,是吗?
有什么更好的方法可以实现这一目标?
答案 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。