![](/img/trans.png)
[英]How do I write an sql query to display items from 2 tables based on a selection of a criteria which is from a different table
[英]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
我想对此查询添加限制:
如何编写查询以获得此类结果? 我知道我可以使用LIMIT
来限制结果的数量,但是有什么方法可以确保结果没有冗余?
您可以通过将(preference1, preference2, preference3)
分离到单独的表中来简化这一过程,我们称之为“规范化”。
如果可能,您应该创建类似以下的表:
CREATE TABLE application (application_id ... PRIMARY KEY, sex ..., poor ...);
CREATE TABLE preference (application_id ..., dorm ..., rank ...);
现在,对于每个application
, preference
表中将包含三行:一行的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.