我一直在查看有关从数据库中选择分层内容的帖子,但我仍然怀疑如何实现以下内容: 我有三张桌子:
请注意,管理员可以说:“用户1将看到来自日本的所有建筑物,并且他也能够看到来自法国的特定建筑物,但只能看到那个”。
尽管如此,我想建立一个菜单(针对特定用户),类似于:
我对如何获取这些信息有一些疑问,我将不胜感激。
编辑:
表格结构:
1)建筑物
2)地点
3)公司
4)用户
5)用户建筑
6)用户位置
这个想法是公司可以分配用户可以看到的建筑物。公司可以分配特定的建筑物(不依赖于位置),这就是用户建筑表的存在,以及它们也可以分配位置的原因,因此用户将看到属于该位置的所有建筑物。
感谢您的评论,我希望我已经澄清了一点。
感谢。
答案 0 :(得分:1)
如果你想坚持使用当前的数据库模式,问题是位置似乎没有固定数量的级别,所以你必须做一个丑陋的循环来获取user_location.id_location
的子级别他们的建筑。
如果您能够区分有意义的类别(如地区,国家,城市)中的位置级别,那将会有很大帮助。这样你就可以有这样的表定义:
CREATE TABLE buildings (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
...
region_id INTEGER UNSIGNED NOT NULL,
country_id INTEGER UNSIGNED NOT NULL,
city_id INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (id),
INDEX (region_id),
INDEX (country_id),
INDEX (city_id),
FOREIGN KEY (region_id) REFERENCES locations(id) ON DELETE RESTRICT,
FOREIGN KEY (country_id) REFERENCES locations(id) ON DELETE RESTRICT,
FOREIGN KEY (city_id) REFERENCES locations(id) ON DELETE RESTRICT
) TYPE=InnoDB;
CREATE TABLE user_location (
user_id INTEGER UNSIGNED NOT NULL,
location_id INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (user_id, region_id, country_id, city_id),
INDEX (user_id),
INDEX (location_id),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (location_id) REFERENCES locations(id) ON DELETE CASCADE
) TYPE=InnoDB;
然后你可以像这样检索你的建筑物:
SELECT * FROM buildings WHERE id IN (
(SELECT building_id FROM user_buildings WHERE user_id = ?)
UNION
(SELECT id FROM buildings
LEFT JOIN user_location ON
(user_location.location_id = buildings.region_id
OR user_location.location_id = buildings.country_id
OR user_location.location_id = buildings.city_id)
WHERE user_id = ?)
);
返回的行将包含构建树所需的信息。