SQL只显示可用的记录(3个表)

时间:2017-05-15 14:39:33

标签: php mysql

我为我的大学安置编写了一个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

2 个答案:

答案 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'))

它基于您的查询(那些....)。问题是我不确定你是否可以在子查询中使用子查询。