Mysql 如何用视图反规范化sql中的n_n关系
我有两张桌子Mysql 如何用视图反规范化sql中的n_n关系,mysql,join,multi-select,Mysql,Join,Multi Select,我有两张桌子 account id | desc Prices id | desc Table account存储用户信息,Table prices根据服务类型存储多个价格。 现在,我需要分配适用于每个帐户的价格。 我想显示一个包含价格的结果和一个额外的列,告诉(以列表的形式)应用该服务的帐户 我在想 CREATE TABLE `account` ( `id_account` smallint(2) unsigned PRIMARY KEY AUTO_INCRE
account
id | desc
Prices
id | desc
Table account
存储用户信息,Table prices
根据服务类型存储多个价格。
现在,我需要分配适用于每个帐户的价格。
我想显示一个包含价格的结果和一个额外的列,告诉(以列表的形式
)应用该服务的帐户
我在想
CREATE TABLE `account` (
`id_account` smallint(2) unsigned PRIMARY KEY AUTO_INCREMENT,
`user` VARCHAR(55) ,
`pass` VARCHAR(55) ,
`descr` VARCHAR(250)
);
INSERT INTO account VALUES
(1,'67395' , 'pass1','DrHeL'),
(2,'12316' , 'pass2','DeHrL'),
(3,'92316' , 'pass3','EfL');
CREATE TABLE `prices`(
`id_price` smallint(2) unsigned PRIMARY KEY AUTO_INCREMENT,
`service` VARCHAR(40),
`cost_1_1Kg` double ,
`cost_4_1Kg` double ,
`cost_8_1Kg` double
);
INSERT INTO prices VALUES
(1,'laundry', 1.50, 2.00,5.00),
(2,'walk.' , 2.50, 3.00,4.00);
CREATE TABLE `account_prices` (
`id_account` smallint(2) unsigned NOT NULL,
`id_price` smallint(2) unsigned NOT NULL,
`descr` VARCHAR(250)
) ;
INSERT INTO account_prices VALUES
(1,1,'apply SERVICE WITH ID 1 AND SERVICE WITH ID 2'),
(2,1,'apply SERVICE WITH ID 1 AND SERVICE WITH ID 2'),
(3,1,'apply SERVICE WITH ID 1 AND SERVICE WITH ID 2'),
(1,2,'apply SERVICE WITH ID 1 AND SERVICE WITH ID 2'),
(2,2,'apply SERVICE WITH ID 1 AND SERVICE WITH ID 2'),
(3,2,'apply SERVICE WITH ID 1 AND SERVICE WITH ID 2');
这给了我
ID_ACCOUNT ID_PRICE DESCR USER PASS SERVICE COST_1_1KG COST_4_1KG COST_8_1KG
1 1 apply SERVICE WITH ID 1 AND SERVICE WITH ID 2 67395 pass1 laundry 1.5 2 5
2 1 apply SERVICE WITH ID 1 AND SERVICE WITH ID 2 12316 pass2 laundry 1.5 2 5
3 1 apply SERVICE WITH ID 1 AND SERVICE WITH ID 2 92316 pass3 laundry 1.5 2 5
1 2 apply SERVICE WITH ID 1 AND SERVICE WITH ID 2 67395 pass1 walk. 2.5 3 4
2 2 apply SERVICE WITH ID 1 AND SERVICE WITH ID 2 12316 pass2 walk. 2.5 3 4
3 2 apply SERVICE WITH ID 1 AND SERVICE WITH ID 2 92316 pass3 walk. 2.5 3 4
然而,我希望有这样的想法:
ID_PRICE SERVICE COST_1_1KG COST_4_1KG COST_8_1KG descr
1 laundry 1.5 2 5 acount 1, account 2, account 3
2 walk. 2.5 3 4 acount 1, account 2, account 3
怎么做
请看一下相应的小提琴:
您可以通过此查询获得所需的输出:
选择ap.id\u价格
,p.服务
,p.成本为1千克
,p.cost_4_1Kg
,成本为8公斤
,concat组(
concat(“账户”,应付账款账户)
按ap.id\U账户订购
分隔符','
)如描述
来自账户价格ap
内部连接价格p使用(id\U价格)
按ap.id\U价格分组
结果:
|标识|价格|服务|成本| 1千克|成本| 4千克|成本| 8千克|描述|
|----------|---------|------------|------------|------------|---------------------------------|
|1 |洗衣房| 1.5 | 2 | 5 |账户1、账户2、账户3|
|2 |步行2.5 | 3 | 4 |科目1、科目2、科目3|
工作原理:
account\u prices
加入prices
即可获得所需的所有数据account x
内容,请使用concat()
函数将“account”
与id\u account
的值连接起来group\u concat()
函数。它的工作原理与任何其他聚合函数类似,但它不是执行操作(如sum()
或count()
),而是连接列(或表达式)的值。您可以定义输出的顺序和自定义分隔符(默认分隔符为,
)