Sql 普通taks复解

Sql 普通taks复解,sql,mariadb,Sql,Mariadb,我有一些用户(C1、C2、C3等)在不同的商店(St1、St2、St3、St4等)处理产品(aa、bb、cc、dd、ee、ff、gg、hh等)。 列表中的每个用户都想知道他们可以在哪个商店更便宜地处理哪些产品。 如果用户希望至少获得以下三项内容(一次一项),则如何查找表和查询: 1-获得自己的产品清单。例如: 公关St1 St2 St3 St4 aa$20$12$19$22 bb$31$44$38$44 抄送$18$12$19$22 dd$36$44$38$44 ee$15$12$19$22

我有一些用户(C1、C2、C3等)在不同的商店(St1、St2、St3、St4等)处理产品(aa、bb、cc、dd、ee、ff、gg、hh等)。
列表中的每个用户都想知道他们可以在哪个商店更便宜地处理哪些产品。
如果用户希望至少获得以下三项内容(一次一项),则如何查找表和查询:

1-获得自己的产品清单。例如:

公关St1 St2 St3 St4
aa$20$12$19$22
bb$31$44$38$44
抄送$18$12$19$22
dd$36$44$38$44
ee$15$12$19$22


2-获得一份最低价格(但高于0)的清单,看看如果他/她在其他商店经营相同的产品,他/她能节省多少钱。例如:

公关St4 St1 St3 St2
bb$23$27$26$28
ee$14$15$15$20
hh$36$38$40$37
合计$73$80$81$85
计数产品3。


公关St2 St1 St3 St4
aa$32$33$38$36
抄送$21$29$27$25
ff$13$14$17$20
总额为$66$76$82$81
数一数产品3


3-获得每家商店都有cero价格的产品清单。例如:

公关St1 St2 St3 St4
kk$00$12$19$22
ii$00$44$38$44

公关St2 St1 St3 St4
ll$00$21$52$20
mm$00$13$17$15



一个不好的解决方案:

创建表格
usrs
(
idc
INT不为空,
name
VARCHAR(50)不为空,
存储
VARCHAR(50)不为空,
pwd
VARBINARY(72)不为空, 主键(
idc
) ) 评论客户的 校对class='utf8\u概述\u ci' 发动机=MyISAM

创建表
存储
(
ids
INT不为空,
nm
VARCHAR(50)不为空, 主键(
ids
) ) 校对class='utf8\u概述\u ci' 发动机=MyISAM

创建表
产品
(
idp
INT(11)非空自动增量,
prod
VARCHAR(50)不为空,
st1
MEDIUMINT(9)空默认值“0”,
st2
MEDIUMINT(9)空默认值“0”,
st3
MEDIUMINT(9)空默认值“0”,
st4
MEDIUMINT(9)空默认值“0”, 主键(
idp
) ) 校对class='utf8\u概述\u ci' 发动机=MyISAM;

在产品(产品、st1、st2、st3、st4)中插入值(aa、14、20、13、17)
插入产品(产品、st1、st2、st3、st4)值(bb、33、29、38、33)
插入产品(产品、st1、st2、st3、st4)值(cc、19、20、00、21)
插入产品(产品、st1、st2、st3、st4)值(dd、22、29、25、33)
插入产品(产品、st1、st2、st3、st4)值(ee,30,00,35,29)
插入产品(产品、st1、st2、st3、st4)值(ff、10、14、11、13)
在产品(产品、st1、st2、st3、st4)中插入值(gg,00,00,00,00)
插入产品(产品、st1、st2、st3、st4)值(hh、16、22、30、10)
在产品(产品、st1、st2、st3、st4)中插入值(ii、23、34、34、26)
插入产品(产品、st1、st2、st3、st4)值(jj,41,32,39,41)
插入产品(产品、st1、st2、st3、st4)值(kk、25、29、26、19)
在产品(产品、st1、st2、st3、st4)中插入值(ll、24、27、10、24)
插入产品(产品、st1、st2、st3、st4)值(mm、29、41、37、36)


我不知道当商店数超过2,用户数超过1时,所有的表会是什么样子。 在我的解决方案中,当用户或存储增加时,我必须手动更改表。我知道这里需要表之间的关系,但我没有发现它。糟糕,非常糟糕…

提前谢谢

您可以更改您的解决方案,这样您就有了一个连接商店和产品的价格列表

价格是产品、商店和价格的元组

然后,您可以在此表上使用左联接进行选择。where子句可以具有指定的存储id、价格要求和/或产品id

示例:

为了更清楚,我修改了你们桌子的名称。在MariaDB上测试的示例

首先,我将使用的模型:

CREATE TABLE `stores` (
    `id` INT NOT NULL,
    `name` VARCHAR(50) NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `products` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `prices` (
    `product_id` INT(11) NOT NULL,
    `store_id` INT NOT NULL,
    `price` DOUBLE NOT NULL,

    CONSTRAINT productIdToStoreID UNIQUE (product_id, store_id)
);
下面是我将如何填充数据库

INSERT INTO stores (id, name) VALUES (10, "Foo's Fun");
INSERT INTO stores (id, name) VALUES (20, "Bar's Barn");

INSERT INTO products (id, name) VALUES (10, "0xC0C0C01A");
INSERT INTO products (id, name) VALUES (20, "0xDEADBEEF");

INSERT INTO prices (product_id, store_id, price) VALUES (10, 10, 1.50);
INSERT INTO prices (product_id, store_id, price) VALUES (10, 20, 1.60);

INSERT INTO prices (product_id, store_id, price) VALUES (20, 10, 40);
INSERT INTO prices (product_id, store_id, price) VALUES (20, 20, 35);
以下是一些您可以编写的查询的起点:

SELECT store_id, price FROM prices WHERE product_id = 10; -- All prices for product with id 10
SELECT store_id, price FROM prices WHERE product_id = 10 ORDER BY price ASC LIMIT 1; -- Get Cheapest Price and Store for product 10

SELECT stores.name, price FROM prices LEFT JOIN stores ON (stores.id = store_id) WHERE product_id = 10 ORDER BY price ASC LIMIT 1; -- Get the Store name and price.
动机:

我们需要一种能够关联n个商店,m个产品的方法。(不确定用户在这里的位置)。我们需要一个能够容纳以下内容的数据结构:

  • 如果商店有商品(反之,如果商品在商店中)。我们可以看到这是一种多对多的关系。SQL数据库往往针对这种类型的关系进行了真正的优化
  • 商店里产品的价格
  • 因此,我们创建了一个表,用额外的价格元数据将产品唯一地链接到商店

    正如您所指出的,另一种选择是一个表,其中包含作为列的所有存储。但是,这并不能很好地扩展,因为添加、删除或更改存储的名称将是一个O(n)更新。在生产环境中,这将是有害的,因为这可能会锁定数据库。但我离题了


    此解决方案通过允许商店列表和产品列表与实际产品分离来解决此问题。如果某个商品的价格存在于某个商店,则会有一行。这意味着空间复杂度在最坏情况下为O(n),但实际上要小得多,因为并非所有商店都有所有产品。

    对不起,Juan,从数据中不清楚与客户的关系是什么?所有客户的产品价格都一样吗?克里斯:谢谢你的回答。看来我对自己的解释不够好,因为你误解了这个问题。Supouse你是一个用户,想知道在不同商店的一个列表中每个产品的价格,Supouse你的朋友也想知道(相同的产品列表)。你有一张单子吗