可能是一个很难解决的问题。我也意识到这里可能有不止一个正确的答案,但主要是关于如何自动化这个过程。
我有很多学生在InnoDb桌子上。在另一张桌子上,我找到了他们最喜欢的室友选择。
f 211
在第三张桌子上,我的房间将被填满。这些房间有两张到三张床。没有一张床或四张床的房间。
就约束而言,这一切都是可行的。的问题是,我如何使用MySQL (或其他编程,最好是PHP)来自动化这个过程,从而使每个人都感到高兴?
我假设选择的第一个室友是学生最想要的,因此我根据提到的顺序从1到4给出了选择。当然,有时候这次撞车和两个学生在第一名上有相同的选择。还有一个人没有被任何人选择的问题,但是你可以假设他们会在这方面变得成熟。
发布于 2012-03-15 18:47:47
首先,我会保存数据库的备份,以防您的过程出错:
mysql -h host -u username -p password database_name > database_name_backup.sql如果你还没有一张教室和学生的桌子,你也需要一张接合桌。所以,就像:
CREATE TABLE room_pupil (
room_id int NOT NULL,
pupil_id int NOT NULL
);请注意,虽然您在问题中很好地描述了您的表,但是为您的表定义(复制表和关系的语句)提供精确的DDL可以帮助人们回答这些类型的问题。为了将来的参考,这里没有任何伤害:)
在那里,您可以运行以下脚本的类型来创建一个存储过程,然后您可以调用它来获得一个好的解决方案
(注:这实际上并不适合你!)您将需要修复这个以使匹配更好,并根据您的特定数据类型定制它!甚至可能是一个或两个语法错误,在这里,我写它有点盲目。学钓鱼比养鱼好,不过^^)
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
https://stackoverflow.com/questions/9674956
复制相似问题