I have a table tags with fields tag_id and name. I have a junction table tag_map with fields tag_id and vid_id that connects table tags to table video (via vid_id).
When I insert a new tag for a vid_id, I delete all my entries in tag_map for that vid_id, if there was only one entry in tag_map I also want to delete that tag in table tags to prevent ghost entries (tags entries without a corresponding tag_map entry).
The issue is, I cannot seem to accurately obtain this count. For example if I have 3 entries in tag_map, each having 1 corresponding tag in tags, I get count for each tag as 1,0,0. Am I using the wrong query for this purpose?
//find all tags for given vid_id
$sql = 'SELECT tag_map.*, tags2.name AS tag_name
FROM tag_map
INNER JOIN tags2 ON tags2.tag_id = tag_map.tag_id
INNER JOIN video ON video.vid_id = tag_map.vid_id
WHERE tag_map.vid_id=?';
$stmt_tags = $conn->prepare($sql);
$result=$stmt_tags->execute(array($vid_id));
while ($row = $stmt_tags->fetch(PDO::FETCH_ASSOC)) {
$tag_name=$row['tag_name'];
//for each tag check how many rows exist in tag_map COUNT IS NOT ACCURATE
$sql = 'SELECT *, COUNT(tags2.name) as cnt
FROM tag_map
JOIN tags2 ON tags2.tag_id = tag_map.tag_id
JOIN video ON video.vid_id = tag_map.vid_id
WHERE tags2.name=?';
$stmt_tags2 = $conn->prepare($sql);
$result=$stmt_tags2->execute(array($tag_name));
while ($row2 = $stmt_tags2->fetch(PDO::FETCH_ASSOC)) {
echo $cnt=$row2['cnt'];
}
if ($cnt==1){
$sql = "DELETE FROM tag_map WHERE vid_id = ?";
$stmt14 = $conn->prepare($sql);
$result=$stmt14->execute(array($vid_id));
$sql = "DELETE FROM tags2 WHERE tags2.name = ?";
$stmt14 = $conn->prepare($sql);
$result=$stmt14->execute(array($tag_name));
}
else {
$sql = "DELETE FROM tag_map WHERE vid_id = ?";
$stmt14 = $conn->prepare($sql);
$result=$stmt14->execute(array($vid_id));
}
}
EDIT for inserting into many to many
foreach($variable as $tag) {
$sql = 'SELECT *, COUNT(tags2.name) as cnt
FROM tag_map
JOIN tags2 ON tags2.tag_id = tag_map.tag_id
JOIN video ON video.vid_id = tag_map.vid_id
WHERE tags2.name=?';
$stmt_tags2 = $conn->prepare($sql);
$result=$stmt_tags2->execute(array($tag));
while ($row = $stmt_tags2->fetch(PDO::FETCH_ASSOC)) {
$cnt=$row['cnt'];
$exist_tag_id=$row['tag_id'];
}
$id=md5(uniqid());
$tag_id=md5(uniqid());
if ($cnt==0){
$sql="INSERT into tag_map (id,vid_id,tag_id) VALUES (?,?,?)";
$stmt16 = $conn->prepare($sql);
$result=$stmt16->execute(array($id,$vid_id,$tag_id));
$sql="INSERT into tags2 (tag_id,name) VALUES (?,?)";
$stmt16 = $conn->prepare($sql);
$result=$stmt16->execute(array($tag_id,trim($tag)));
}
else {
$sql="INSERT into tag_map (id,vid_id,tag_id) VALUES (?,?,?)";
$stmt16 = $conn->prepare($sql);
$result=$stmt16->execute(array($id,$vid_id,$exist_tag_id));
}
}
You really don’t even need to worry about the count. Delete from tag_map and then: