从 2 个与 WHERE clausule 有关系的表中获取数据



我一直在关注 PHP 身份验证教程 en 设法让它工作。

现在我想向导航栏添加一个函数。我会尝试解释,希望有人知道答案。

我有 2 个用户表,用户和 user_permissions.
在用户表中还有名为district_iddistrictgemeente_idgemeente的附加列。我在数据库中还有 2 个额外的表,称为districtengemeenten.

districten表有 2 列。iddistrict拥有独特的IDnamegemeente表至少有这 3 列iddistrict_idgemeente

以下是我希望发生的事情:

当用户登录查询时,将在导航栏中的<ul>中给出结果,其中将显示用户分配到的gemeenten表中的所有值(列gemeente)。

例:

用户 ZZZ 被分配到区 A.
该区拥有 4 个 gemeenten:城市 1、城市 2、城市 3 和城市 4

当用户登录时,他应该 只看到A区的城市。

我不知道如何在 Slim2 框架中使其工作并集成到 PHP 身份验证代码中。因此,非常感谢任何帮助。

首先,您必须规范化表并删除冗余信息,因为在关系数据库中很难维护它(我假设您在这里使用像MySQL这样的关系数据库)。

所以基本上每个用户都被分配到 gemeente,每个 gemeente 被分配到区,而区又有城市(gemeenten)。在用户表中,您只需要gemeente_iddistrictengemeente的架构似乎很好。

有两种方法可以检索所需数据:运行 2 个查询(1 个用于获取用户的选区;2 个用于获取选区的城市)并在一个查询中运行所有内容。选择哪种方式取决于您。

第一种方法:

SELECT d.id FROM district AS d LEFT JOIN gemeente AS g ON g.district_id=d.id LEFT JOIN user AS u ON u.gemeente_id=g.id WHERE u.id=<user_id>

SELECT g.id, g.gemeenten from gemeente as g where g.district_id = <res_of_prev_query>

第二种方法:

SELECT g.id, g.gemeenten FROM gemeente AS g LEFT JOIN districten AS d ON g.district_id=d.id INNER JOIN ( SELECT DISTINCT district_id, u.id AS user_id FROM gemeente as gg INNER JOIN user AS u ON u.gemeente_id=gg.id) AS ud ON ud.district_id=g.district_id WHERE ud.user_id=<user_id>

您需要将此查询转换为您的ORM/ActiveRecord,运行它并显示ul列表

UPD:我已经更新了我的答案。感谢@DarkBee指出我的错误

最新更新