我有几个具有多对多关系的表。\n例如表视频架构
\n\nCREATE TABLE `videos` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `description` varchar(10000) DEFAULT NULL,\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=47606 DEFAULT CHARSET=utf8;\nRun Code Online (Sandbox Code Playgroud)\n\n和两个表 actor film_actors,例如 writers 和 film_writers
\n\n演员和电影演员模式
\n\nCREATE TABLE `actors` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `name` varchar(255) DEFAULT NULL,\n PRIMARY KEY (`id`),\n UNIQUE KEY `actors_UN` (`name`)\n) ENGINE=InnoDB AUTO_INCREMENT=152216 DEFAULT CHARSET=utf8;\n\n\nCREATE TABLE `film_actors` (\n `actor_id` int(11) NOT NULL,\n `film_id` int(11) NOT NULL,\n PRIMARY KEY (`film_id`,`actor_id`),\n KEY `FKrs472oyyff3hfwq10pyo94k1d` (`actor_id`),\n CONSTRAINT `FK12uvap3je50qd8cq3s0jf7h7r` FOREIGN KEY (`film_id`) REFERENCES `videos` (`id`) ON DELETE CASCADE,\n CONSTRAINT `FKrs472oyyff3hfwq10pyo94k1d` FOREIGN KEY (`actor_id`) REFERENCES `actors` (`id`) ON DELETE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\nRun Code Online (Sandbox Code Playgroud)\n\n作家
\n\nCREATE TABLE `writers` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `name` varchar(255) NOT NULL,\n PRIMARY KEY (`id`),\n UNIQUE KEY `writers_UN` (`name`)\n) ENGINE=InnoDB AUTO_INCREMENT=39875 DEFAULT CHARSET=utf8;\n\nCREATE TABLE `film_writers` (\n `film_id` int(11) NOT NULL,\n `writer_id` int(11) NOT NULL,\n PRIMARY KEY (`writer_id`,`film_id`),\n KEY `FKh0kfwnarp6utb4f80ycj1lap` (`film_id`),\n CONSTRAINT `FK4hwpb5l48m0xps6jqn1wyjb63` FOREIGN KEY (`writer_id`) REFERENCES `writers` (`id`) ON DELETE CASCADE,\n CONSTRAINT `FKh0kfwnarp6utb4f80ycj1lap` FOREIGN KEY (`film_id`) REFERENCES `videos` (`id`) ON DELETE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试与演员和作家一起选择电影信息,但结果包含许多重复的行。我使用这个sql查询
\n\nSELECT\n vid.id,\n vid.title,\n vid.original_title_name,\n vid.`year`,\n ac.id as actor_id,\n ac.name as actor_name,\n wr.id as writer_id,\n wr.name as writer_name\nfrom\n (\n select\n *\n From\n videos v\n where\n v.id = 1722\n ) vid\nJOIN film_actors fa ON\n vid.id = fa.film_id\nJOIN actors ac ON\n fa.actor_id = ac.id\nJOIN film_writers fw ON\n vid.id = fw.film_id\nJOIN writers wr ON\n fw.writer_id = wr.id\nRun Code Online (Sandbox Code Playgroud)\n\n输出是很多重复行。
\n\nid |title |original_title_name |year |actor_id |actor_name |writer_id |writer_name |\n-----|----------------|--------------------|-----|---------|-------------------|----------|---------------|\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |1796 |\xd0\x9c\xd0\xb0\xd0\xb9\xd0\xba\xd0\xbb \xd0\x94\xd0\xb6. \xd0\xa4\xd0\xbe\xd0\xba\xd1\x81 |319 |\xd0\x91\xd0\xbe\xd0\xb1 \xd0\x93\xd0\xb5\xd0\xb9\xd0\xbb |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |2648 |\xd0\x94\xd0\xb6\xd0\xbe\xd1\x80\xd0\xb4\xd0\xb6 \xd0\x94\xd0\xb8\xd0\xa7\xd0\xb5\xd0\xbd\xd1\x86\xd0\xbe |319 |\xd0\x91\xd0\xbe\xd0\xb1 \xd0\x93\xd0\xb5\xd0\xb9\xd0\xbb |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |4807 |\xd0\x9a\xd1\x80\xd0\xb8\xd1\x81\xd0\xbf\xd0\xb8\xd0\xbd \xd0\x93\xd0\xbb\xd0\xbe\xd0\xb2\xd0\xb5\xd1\x80 |319 |\xd0\x91\xd0\xbe\xd0\xb1 \xd0\x93\xd0\xb5\xd0\xb9\xd0\xbb |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |7601 |\xd0\x9a\xd1\x80\xd0\xb8\xd1\x81\xd1\x82\xd0\xbe\xd1\x84\xd0\xb5\xd1\x80 \xd0\x9b\xd0\xbb\xd0\xbe\xd0\xb9\xd0\xb4 |319 |\xd0\x91\xd0\xbe\xd0\xb1 \xd0\x93\xd0\xb5\xd0\xb9\xd0\xbb |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |8195 |\xd0\x9b\xd0\xb8\xd0\xb0 \xd0\xa2\xd0\xbe\xd0\xbc\xd0\xbf\xd1\x81\xd0\xbe\xd0\xbd |319 |\xd0\x91\xd0\xbe\xd0\xb1 \xd0\x93\xd0\xb5\xd0\xb9\xd0\xbb |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |8707 |\xd0\x9c\xd0\xb0\xd1\x80\xd0\xba \xd0\x9c\xd0\xb0\xd0\xba\xd0\x9a\xd0\xbb\xd1\x8e\xd1\x80 |319 |\xd0\x91\xd0\xbe\xd0\xb1 \xd0\x93\xd0\xb5\xd0\xb9\xd0\xbb |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |9242 |\xd0\xa4\xd1\x80\xd1\x8d\xd0\xbd\xd1\x81\xd0\xb8\xd1\x81 \xd0\x9b\xd0\xb8 \xd0\x9c\xd0\xb0\xd0\xba\xd0\x9a\xd0\xb5\xd0\xb9\xd0\xbd |319 |\xd0\x91\xd0\xbe\xd0\xb1 \xd0\x93\xd0\xb5\xd0\xb9\xd0\xbb |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |9602 |\xd0\xa3\xd1\x8d\xd0\xbd\xd0\xb4\xd0\xb8 \xd0\x94\xd0\xb6\xd0\xbe \xd0\xa1\xd0\xbf\xd0\xb5\xd1\x80\xd0\xb1\xd0\xb5\xd1\x80 |319 |\xd0\x91\xd0\xbe\xd0\xb1 \xd0\x93\xd0\xb5\xd0\xb9\xd0\xbb |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |10545 |\xd0\x9a\xd0\xbb\xd0\xb0\xd1\x83\xd0\xb4\xd0\xb8\xd1\x8f \xd0\xa3\xd1\x8d\xd0\xbb\xd0\xbb\xd1\x81 |319 |\xd0\x91\xd0\xbe\xd0\xb1 \xd0\x93\xd0\xb5\xd0\xb9\xd0\xbb |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |10546 |\xd0\xa2\xd0\xbe\xd0\xbc\xd0\xb0\xd1\x81 \xd0\xa4. \xd0\xa3\xd0\xb8\xd0\xbb\xd1\x81\xd0\xbe\xd0\xbd |319 |\xd0\x91\xd0\xbe\xd0\xb1 \xd0\x93\xd0\xb5\xd0\xb9\xd0\xbb |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |1796 |\xd0\x9c\xd0\xb0\xd0\xb9\xd0\xba\xd0\xbb \xd0\x94\xd0\xb6. \xd0\xa4\xd0\xbe\xd0\xba\xd1\x81 |320 |\xd0\xa0\xd0\xbe\xd0\xb1\xd0\xb5\xd1\x80\xd1\x82 \xd0\x97\xd0\xb5\xd0\xbc\xd0\xb5\xd0\xba\xd0\xb8\xd1\x81 |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |2648 |\xd0\x94\xd0\xb6\xd0\xbe\xd1\x80\xd0\xb4\xd0\xb6 \xd0\x94\xd0\xb8\xd0\xa7\xd0\xb5\xd0\xbd\xd1\x86\xd0\xbe |320 |\xd0\xa0\xd0\xbe\xd0\xb1\xd0\xb5\xd1\x80\xd1\x82 \xd0\x97\xd0\xb5\xd0\xbc\xd0\xb5\xd0\xba\xd0\xb8\xd1\x81 |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |4807 |\xd0\x9a\xd1\x80\xd0\xb8\xd1\x81\xd0\xbf\xd0\xb8\xd0\xbd \xd0\x93\xd0\xbb\xd0\xbe\xd0\xb2\xd0\xb5\xd1\x80 |320 |\xd0\xa0\xd0\xbe\xd0\xb1\xd0\xb5\xd1\x80\xd1\x82 \xd0\x97\xd0\xb5\xd0\xbc\xd0\xb5\xd0\xba\xd0\xb8\xd1\x81 |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |7601 |\xd0\x9a\xd1\x80\xd0\xb8\xd1\x81\xd1\x82\xd0\xbe\xd1\x84\xd0\xb5\xd1\x80 \xd0\x9b\xd0\xbb\xd0\xbe\xd0\xb9\xd0\xb4 |320 |\xd0\xa0\xd0\xbe\xd0\xb1\xd0\xb5\xd1\x80\xd1\x82 \xd0\x97\xd0\xb5\xd0\xbc\xd0\xb5\xd0\xba\xd0\xb8\xd1\x81 |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |8195 |\xd0\x9b\xd0\xb8\xd0\xb0 \xd0\xa2\xd0\xbe\xd0\xbc\xd0\xbf\xd1\x81\xd0\xbe\xd0\xbd |320 |\xd0\xa0\xd0\xbe\xd0\xb1\xd0\xb5\xd1\x80\xd1\x82 \xd0\x97\xd0\xb5\xd0\xbc\xd0\xb5\xd0\xba\xd0\xb8\xd1\x81 |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |8707 |\xd0\x9c\xd0\xb0\xd1\x80\xd0\xba \xd0\x9c\xd0\xb0\xd0\xba\xd0\x9a\xd0\xbb\xd1\x8e\xd1\x80 |320 |\xd0\xa0\xd0\xbe\xd0\xb1\xd0\xb5\xd1\x80\xd1\x82 \xd0\x97\xd0\xb5\xd0\xbc\xd0\xb5\xd0\xba\xd0\xb8\xd1\x81 |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |9242 |\xd0\xa4\xd1\x80\xd1\x8d\xd0\xbd\xd1\x81\xd0\xb8\xd1\x81 \xd0\x9b\xd0\xb8 \xd0\x9c\xd0\xb0\xd0\xba\xd0\x9a\xd0\xb5\xd0\xb9\xd0\xbd |320 |\xd0\xa0\xd0\xbe\xd0\xb1\xd0\xb5\xd1\x80\xd1\x82 \xd0\x97\xd0\xb5\xd0\xbc\xd0\xb5\xd0\xba\xd0\xb8\xd1\x81 |\nRun Code Online (Sandbox Code Playgroud)\n\n是否有可能以某种方式将结果转换为类似的结果?
\n\nid |title |original_title_name |year |actor_id |actor_name |writer_id |writer_name |\n-----|----------------|--------------------|-----|---------|-------------------|----------|---------------|\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |1796 |\xd0\x9c\xd0\xb0\xd0\xb9\xd0\xba\xd0\xbb \xd0\x94\xd0\xb6. \xd0\xa4\xd0\xbe\xd0\xba\xd1\x81 |319 |\xd0\x91\xd0\xbe\xd0\xb1 \xd0\x93\xd0\xb5\xd0\xb9\xd0\xbb |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |2648 |\xd0\x94\xd0\xb6\xd0\xbe\xd1\x80\xd0\xb4\xd0\xb6 \xd0\x94\xd0\xb8\xd0\xa7\xd0\xb5\xd0\xbd\xd1\x86\xd0\xbe |320 |\xd0\xa0\xd0\xbe\xd0\xb1\xd0\xb5\xd1\x80\xd1\x82 \xd0\x97\xd0\xb5\xd0\xbc\xd0\xb5\xd0\xba\xd0\xb8\xd1\x81 |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |4807 |\xd0\x9a\xd1\x80\xd0\xb8\xd1\x81\xd0\xbf\xd0\xb8\xd0\xbd \xd0\x93\xd0\xbb\xd0\xbe\xd0\xb2\xd0\xb5\xd1\x80 | | |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |7601 |\xd0\x9a\xd1\x80\xd0\xb8\xd1\x81\xd1\x82\xd0\xbe\xd1\x84\xd0\xb5\xd1\x80 \xd0\x9b\xd0\xbb\xd0\xbe\xd0\xb9\xd0\xb4 | | |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |8195 |\xd0\x9b\xd0\xb8\xd0\xb0 \xd0\xa2\xd0\xbe\xd0\xbc\xd0\xbf\xd1\x81\xd0\xbe\xd0\xbd | | |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |8707 |\xd0\x9c\xd0\xb0\xd1\x80\xd0\xba \xd0\x9c\xd0\xb0\xd0\xba\xd0\x9a\xd0\xbb\xd1\x8e\xd1\x80 | | |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |9242 |\xd0\xa4\xd1\x80\xd1\x8d\xd0\xbd\xd1\x81\xd0\xb8\xd1\x81 \xd0\x9b\xd0\xb8 \xd0\x9c\xd0\xb0\xd0\xba\xd0\x9a\xd0\xb5\xd0\xb9\xd0\xbd | | |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |9602 |\xd0\xa3\xd1\x8d\xd0\xbd\xd0\xb4\xd0\xb8 \xd0\x94\xd0\xb6\xd0\xbe \xd0\xa1\xd0\xbf\xd0\xb5\xd1\x80\xd0\xb1\xd0\xb5\xd1\x80 | | |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |10545 |\xd0\x9a\xd0\xbb\xd0\xb0\xd1\x83\xd0\xb4\xd0\xb8\xd1\x8f \xd0\xa3\xd1\x8d\xd0\xbb\xd0\xbb\xd1\x81 | | |\n1722 |\xd0\x9d\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xb4 \xd0\xb2 \xd0\xb1\xd1\x83\xd0\xb4\xd1\x83\xd1\x89\xd0\xb5\xd0\xb5 |Back to the Future |1985 |10546 |\xd0\xa2\xd0\xbe\xd0\xbc\xd0\xb0\xd1\x81 \xd0\xa4. \xd0\xa3\xd0\xb8\xd0\xbb\xd1\x81\xd0\xbe\xd0\xbd | | |\nRun Code Online (Sandbox Code Playgroud)\n
您获得“重复”行的原因是因为一部电影有许多演员,而一部电影有许多作家。电影演员和电影编剧之间根本没有任何关系
用于教育目的的简单查询:
SELECT *
FROM
films
INNER JOIN actors on films.id = actors.filmid
INNER JOIN writers on films.id = writers.filmid
Run Code Online (Sandbox Code Playgroud)
这是为了表达我的观点而简化的,它隐藏了将多:多关系分解为多:一的表的复杂性
现在。如果一部电影有 10 位演员和 11 位编剧,则此查询将生成 110 行
每个演员都会与每个作家联系在一起
为什么?因为电影演员和电影编剧之间绝对没有任何关系。这两件事根本没有任何关系。我们没有在 JOIN 条件中编写任何内容来断言某个 actor 属性等于某个 writer 属性,因为我们不能- 没有任何东西可以将它们两个联系在一起
结果,数据库唯一可能做的就是生成一个行集,其中每个演员/作者组合都有一行。演员数据重复11次,作家数据重复10次
Actor1/Writer1
Actor1/Writer2
...
Actor2/Writer1
Actor2/Writer2
...
Actor10/Writer11
Run Code Online (Sandbox Code Playgroud)
没有办法解决这个“问题”——它是由于试图将两个不相关的事物放在一个查询上而引起的。唯一的“解决方案”是不要将它们放在同一个查询中。如果您正在编写像 IMDB 这样的网站,并且您有一个电影网页,有两个选项卡,一个用于演员,一个用于作家,请运行两个单独的查询(电影加入演员)和(电影加入作家)来填充数据每个选项卡 - 你根本无法*在一个查询中完成它。
*当我说“不能”时,我的意思是“真的不应该”。您发布的“期望结果”网格毫无充分理由地将演员 1796 与作家 319 关联起来- 一行上的所有内容都应该是相关的,这两个实体除了一些任意决定之外没有任何关系,即它们都排名第一当他们的 id 按升序排列时。虽然有一些方法可以用来将它们关联起来并从查询中消除笛卡尔积,但这是一种可怕的代码味道,表明您正在完全解决一些其他问题(我们看不到)。走错路了(抱歉)
| 归档时间: |
|
| 查看次数: |
4434 次 |
| 最近记录: |