繁体   English   中英

如何根据不同优先级的标准编写分配数量有限的位置的SQL查询

[英]How to write an SQL query that allots a limited number of positions, based on criteria of different precedence

我创建了一个页面,可以在此查看学生的宿舍申请。 您可以在以下网址进行预览: http : //formularz.funpic.de/dormitory.htm 我正在寻找写查询以获取页面上显示的信息的帮助。 首先应为贫困学生提供房间,然后再为远离宿舍的学生提供房间。 我有3个宿舍:“ lubel”,“ mleczko”,“ maryks”

我当前的数据库查询如下所示:

SELECT * 
  FROM aplication 
  WHERE (sex='w' AND preference1='lubel') 
  GROUP BY poor DESC, distance DESC 
UNION ALL SELECT * 
  FROM aplication 
  WHERE (sex='w' AND preference2='lubel' AND poor='') 
  GROUP BY distance DESC  
UNION ALL SELECT * 
  FROM aplication 
  WHERE (sex='w' AND preference3='lubel' AND poor='') 
  GROUP BY distance DESC

我想对此查询添加限制:

  • 适用于Lubel:12个地方
  • 对于mleczko:13个地方
  • 对于maryks:5个地方

如何编写查询以获得此类结果? 我知道我可以使用LIMIT来限制结果的数量,但是有什么方法可以确保结果没有冗余?

您可以通过将(preference1, preference2, preference3)分离到单独的表中来简化这一过程,我们称之为“规范化”。

如果可能,您应该创建类似以下的表:

CREATE TABLE application (application_id ... PRIMARY KEY, sex ..., poor ...);
CREATE TABLE preference (application_id ..., dorm ..., rank ...);

现在,对于每个applicationpreference表中将包含三行:一行的rank = 1 ,一行的rank = 2 ,另一行的rank = 3

您可能无法永久更改结构,在这种情况下,可以使用TEMPORARY TABLE临时执行相同的操作:

CREATE TEMPORARY TABLE preference (...)
INSERT INTO preference (SELECT application_id, preference1, 1 FROM application);
INSERT INTO preference (SELECT application_id, preference2, 2 FROM application);
INSERT INTO preference (SELECT application_id, preference3, 3 FROM application);

有了这个,查询很简单:

SELECT application.*
FROM application
INNER JOIN preference ON (preference.application_id = application.application_id)
WHERE sex = 'w' AND dorm='lubel' AND poor=''
ORDER BY rank, poor DESC, distance DESC
LIMIT 12

但是您要求的不只是这些:一次真正地对每个人进行排序。

为此,我建议添加一个新的assignment列(同样,可以在必要时暂时完成此操作),因此,通过一系列四个查询,您可以执行以下操作:

UPDATE application SET assignment = NULL

UPDATE application.*
INNER JOIN preference ON (preference.application_id = application.application_id)
SET assignment = 'lubel'
WHERE assignment IS NULL AND sex = 'w' AND dorm='lubel' AND poor=''
ORDER BY rank, poor DESC, distance DESC
LIMIT 12

UPDATE application.*
INNER JOIN preference ON (preference.application_id = application.application_id)
SET assignment = 'mleczko'
WHERE assignment IS NULL AND sex = 'w' AND dorm='mleczko' AND poor=''
ORDER BY rank, poor DESC, distance DESC
LIMIT 13

UPDATE application.*
INNER JOIN preference ON (preference.application_id = application.application_id)
SET assignment = 'maryks'
WHERE assignment IS NULL AND sex = 'w' AND dorm='maryks' AND poor=''
ORDER BY rank, poor DESC, distance DESC
LIMIT 5

请注意,每次您只查找尚未分配任务的人员,因此一旦某人获得选择,任务列将被填充,并且以后将不匹配任何查询。

我假设任何人都可以得到任何宿舍(即,每个人都有全部三个宿舍的偏好;这只是这些偏好的顺序的问题)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM