【问题标题】:MySQL - Remove duplicate records entity relationship many to manyMySQL - 删除重复记录实体关系多对多
【发布时间】:2016-01-29 02:25:59
【问题描述】:

因为我可以从多个表中获取省略重复的记录,例如我有这个表“代码附加表”:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for interests
-- ----------------------------
DROP TABLE IF EXISTS `interests`;
CREATE TABLE `interests` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of interests
-- ----------------------------
INSERT INTO `interests` VALUES ('1', 'Sport');
INSERT INTO `interests` VALUES ('2', 'Technology');
INSERT INTO `interests` VALUES ('3', 'Games');
INSERT INTO `interests` VALUES ('4', 'Security');
INSERT INTO `interests` VALUES ('5', 'Movies');

-- ----------------------------
-- Table structure for interests_has_user
-- ----------------------------
DROP TABLE IF EXISTS `interests_has_user`;
CREATE TABLE `interests_has_user` (
  `interests_id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`interests_id`,`user_id`),
  KEY `fk_interests_has_user_user1_idx` (`user_id`),
  KEY `fk_interests_has_user_interests_idx` (`interests_id`),
  CONSTRAINT `fk_interests_has_user_interests` FOREIGN KEY (`interests_id`) REFERENCES `interests` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_interests_has_user_user1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of interests_has_user
-- ----------------------------
INSERT INTO `interests_has_user` VALUES ('1', '1');
INSERT INTO `interests_has_user` VALUES ('2', '1');
INSERT INTO `interests_has_user` VALUES ('3', '1');
INSERT INTO `interests_has_user` VALUES ('4', '1');
INSERT INTO `interests_has_user` VALUES ('5', '1');

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `email` varchar(45) DEFAULT NULL,
  `password` varchar(45) DEFAULT NULL,
  `country` varchar(45) DEFAULT NULL,
  `state` varchar(45) DEFAULT NULL,
  `city` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'Name', 'email@email.com', '123123', '1', '1', '1');

我需要从 table[user]table[interests_has_user] 中获取记录,其中用户可以在 tabletable[ interests_has_user ],我是这样查询的:

SELECT 
    user.id,
    user.name,
    user.email,
    user.country,
    user.state,
    user.city,
    interests_has_user.interests_id,
    interests_has_user.user_id
FROM 
    user
LEFT JOIN interests_has_user
ON user.id = interests_has_user.user_id
WHERE user.id = 1;

我抛出表 table[interests_has_user] 的所有记录,但在所有行中用户都重复了,图片附有结果。

注意:黄色阴影部分应为空字段。

最好的解决方案是什么,使用 INNER JOIN 或单独的 consutas。

感谢您的帮助,非常感谢。

【问题讨论】:

    标签: mysql database relational-database


    【解决方案1】:

    INNER JOIN 不会返回没有兴趣的用户。所以这不是你想要的。 如果你想减轻查询结果,你可以做两个查询:

    首先找出用户的详细信息

    SELECT 
        user.id,
        user.name,
        user.email,
        user.country,
        user.state,
        user.city
    FROM 
        user
    WHERE user.id = 1
    

    然后是兴趣 ID。

    SELECT user.id, interests_has_user.interests_id, interests_has_user.user_id 
    FROM user 
    LEFT JOIN interests_has_user ON user.id = interests_has_user.user_id 
    WHERE user.id = 1
    

    【讨论】:

    • 非常感谢,感谢您的帮助,它帮助我解决了这个难题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2018-07-04
    相关资源
    最近更新 更多