首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将学生分配给MySQL最喜欢的室友

如何将学生分配给MySQL最喜欢的室友
EN

Stack Overflow用户
提问于 2012-03-12 21:17:34
回答 1查看 142关注 0票数 1

可能是一个很难解决的问题。我也意识到这里可能有不止一个正确的答案,但主要是关于如何自动化这个过程。

我有很多学生在InnoDb桌子上。在另一张桌子上,我找到了他们最喜欢的室友选择。

  • 大多数都选择了两三位最喜欢的室友。
  • 少数学生没有选择。
  • 有些学生最多由其他四个人选择;
  • 有一些学生没有选择。
  • 大多数学生是由一个或两个其他学生选择的。

f 211

在第三张桌子上,我的房间将被填满。这些房间有两张到三张床。没有一张床或四张床的房间。

就约束而言,这一切都是可行的。的问题是,我如何使用MySQL (或其他编程,最好是PHP)来自动化这个过程,从而使每个人都感到高兴?

我假设选择的第一个室友是学生最想要的,因此我根据提到的顺序从1到4给出了选择。当然,有时候这次撞车和两个学生在第一名上有相同的选择。还有一个人没有被任何人选择的问题,但是你可以假设他们会在这方面变得成熟。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-15 18:47:47

首先,我会保存数据库的备份,以防您的过程出错:

代码语言:javascript
复制
mysql -h host -u username -p password database_name > database_name_backup.sql

如果你还没有一张教室和学生的桌子,你也需要一张接合桌。所以,就像:

代码语言:javascript
复制
CREATE TABLE room_pupil (
  room_id int NOT NULL,
  pupil_id int NOT NULL
);

请注意,虽然您在问题中很好地描述了您的表,但是为您的表定义(复制表和关系的语句)提供精确的DDL可以帮助人们回答这些类型的问题。为了将来的参考,这里没有任何伤害:)

在那里,您可以运行以下脚本的类型来创建一个存储过程,然后您可以调用它来获得一个好的解决方案

(注:这实际上并不适合你!)您将需要修复这个以使匹配更好,并根据您的特定数据类型定制它!甚至可能是一个或两个语法错误,在这里,我写它有点盲目。学钓鱼比养鱼好,不过^^)

代码语言:javascript
复制
DELIMITER $$ 
DROP PROCEDURE IF EXISTS RoommateMatching$$ 
CREATE PROCEDURE RoommateMatching() 
BEGIN 
  DECLARE no_more_pupils int DEFAULT 0;
  DECLARE current_pupil CURSOR FOR 
SELECT pupil_id FROM pupils; 
  DECLARE CONTINUE HANDLER FOR NOT FOUND 
SET no_more_pupils = 1; 

/* create a temp table to hold the proposals */ 
CREATE TABLE temp_matches ( 
  proposing_pupil_id int NOT NULL,
  proposed_pupil_id int NOT NULL 
); 
OPEN current_pupil; 

FETCH current_pupil INTO this_pupil; 

REPEAT 

/* Coalesce -1 in so its easy to tell whether they had choices picked or not */
SELECT COALESCE(pupil_choice_id, -1) INTO next_favorite_roommate_id 
  FROM roommate_preference /* TODO Your second table, don't know its name */ 
  WHERE pupil_id = this_pupil; /* TODO since there may be more than one match here or none, might need another iterator */

SELECT COALESCE(proposed_pupil_id, -1) INTO existing_proposal 
  FROM temp_matches
  WHERE proposed_pupil_id = next_favorite_roommate_id;

IF existing_proposal < 0 THEN 
  INSERT INTO temp_matches(proposing_pupil_id, proposed_pupil_id) 
  VALUES (this_pupil, next_favorite_roommate_id); 
END IF; 
IF existing_proposal > 0 THEN
  /* TODO see if there's a better match for existing_proposal here, you write it! */
END IF;
FETCH current_pupil INTO this_pupil; 
UNTIL no_more_pupils = 1 

END REPEAT; 

CLOSE current_pupil; 
/* start an iterator on the matches and insert records into your room_pupil table! */
/* TODO you write that code! */
DROP TABLE temp_matches; 
END$$ 
DELIMITER; 

这至少会让你走上正确的轨道!如果有什么需要进一步澄清的话,请告诉我,但就像我说过的,我不会为您编写完整的算法,请使用wikipedia和mysql手册页来学习如何进入存储过程星区!)

存储过程骨架的来源:http://forums.mysql.com/read.php?98,358569,358569

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9674956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档