我为我的大学安置编写了一个Web系统,并且遇到了最重要的SQL查询的麻烦。我有3张桌子:
host_families(host_id,名称,地址等)
群组(group_id,no_of_students,arrival_date,departure_date)
该系统的目的是将学生从特定的小组分配到特定的寄宿家庭。这些分配保存在下表中:
分配(group_id,host_id,no_of_students)
我已经设法编写了用于查看特定组分配的代码:
SELECT * from host_families, groups
INNER JOIN allocations
WHERE groups.group_id = allocations.group_id
AND host_families.host_id = allocations.host_id
AND groups.group_id = '$id'"
我遇到的一个大问题是,当我将一个寄宿家庭分配到一个到达的群组时,请注意' 2017-06-01'为期一周,该寄宿家庭不应出现在第二天到达的另一组的分配部分,因为他/她将无法使用。
我尝试过使用NO EXIST功能但是这样就完全删除了host_family,即使该群组是2周后(因此可以再次使用)
在PHP中,我使用while循环显示可用的主机系列:
While($row = mysqli_fetch_array($Host_qry_result)){
// table
}
请帮我为我的寄宿家庭表格形成搜索查询,该表格仅显示可用的寄宿家庭,即尚未分配到您正在搜索的群组的到达和离开日期内的群组从
非常感谢!
目前,在用完选项后,我已将查询返回到最简单的
形式SELECt * from host_families
答案 0 :(得分:0)
总结一下,您希望查询返回的是:
解决该问题的最简单方法是获取“忙”族的子集,然后从包含所有族的集合中减去它。您可以使用子查询以及NOT IN
。
我没有测试过以下查询,但它应该可以解决您的问题:
SELECT *
FROM host_families
WHERE host_id NOT IN (
-- Busy host families
SELECT DISTINCT h2.host_id
FROM host_families AS h2
JOIN allocations AS a ON a.host_id = h2.host_id
JOIN groups AS g ON g.group_id = a.group_id
WHERE g.arrival_date <= CURDATE()
AND g.departure_date >= CURDATE()
)
请注意,您可能希望将CURDATE()
替换为通过PHP代码提供的给定日期。我会让你相应地更改上面的查询。
答案 1 :(得分:0)
自从我编写sql语句以来已经有一段时间了,但这可能有助于你继续前进。
SELECT .... FROM
WHERE .... AND host_families.host_id NOT IN
(select a.host_id from allocation a INNER JOIN groups g USING (group_id) where
g.departure_date > (select arrival_date from groups where group_id = '$id'))
它基于您的查询(那些....)。问题是我不确定你是否可以在子查询中使用子查询。