Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何用视图反规范化sql中的n_n关系_Mysql_Join_Multi Select - Fatal编程技术网

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()
    ),而是连接列(或表达式)的值。您可以定义输出的顺序和自定义分隔符(默认分隔符为
  • 希望这对你有帮助