我正在构建一个动态应用程序,它将根据设置进行操作。
设置存储在MySQL表中,该表由应用级数据和全局级数据(app_id = 0)
组成。
我的用例是,我想选择应用程序的设置。如果它不存在,则从全局级别获取相应的设置。
我使用子查询和COALESCE
函数实现了这一点。
问题:可以在单个查询中获取数据吗?如果没有,是否可以修改架构以更简单的方式处理此应用程序级别和全局级别?
模式
CREATE TABLE `settings` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`partner_id` int(11) NOT NULL,
`app_id` int(11) DEFAULT NULL,
`type` varchar(64) DEFAULT NULL,
`name` varchar(64) DEFAULT NULL,
`value` varchar(300) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `key_partner_id` (`partner_id`),
KEY `key_app_id` (`app_id`),
KEY `key_type` (`type`),
KEY `key_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
数据
| id | partner_id | app_id | type | name | value |
|----|------------|--------|-------|---------|--------|
| 1 | 500 | 0 | color | primary | blue |
| 2 | 500 | 100 | color | primary | green |
| 3 | 500 | 101 | color | primary | red |
查询
SELECT * FROM settings WHERE app_id in (
COALESCE ((SELECT app_id FROM settings WHERE app_id = 100), 0)
);
| id | partner_id | app_id | type | name | value |
|----|------------|--------|-------|---------|-------|
| 2 | 500 | 100 | color | primary | green |
SELECT * FROM settings WHERE app_id in (
COALESCE ((SELECT app_id FROM settings WHERE app_id = 102), 0)
);
| id | partner_id | app_id | type | name | value |
|----|------------|--------|-------|---------|-------|
| 1 | 500 | 0 | color | primary | blue |
答案 0 :(得分:0)
单个查询以获取应用的设置或回退到全局设置
SELECT * FROM settings
WHERE app_id IN(0,102)
ORDER BY app_id DESC
LIMIT 1;
显然,这假设应用设置只有一行。