【问题标题】:SQL query from "many to many" table excluding some data with sorting来自“多对多”表的 SQL 查询,不包括一些带排序的数据
【发布时间】:2021-03-12 18:04:48
【问题描述】:

开发者们晚上好!

几天后,我正在处理一个问题 - 也许您可以帮助我。 例如,我从我的数据库中取出两张表:

产品

| id | name | type|
| 1  | product-1  | base  |
| 2  | product-1a | modif |
| 3  | product-1b | modif |
| 4  | product-2  | base  |
| 5  | product-2a | modif |

PRODUCT_SOURCE

| id  | product_id | store_id | quantity | 
|  1  |      2     |     1    |     0    | 
|  2  |      2     |     2    |     5    | 
|  3  |      2     |     3    |     3    | 
|  4  |      3     |     1    |     7    | 
|  5  |      3     |     3    |     0    | 
|  6  |      5     |     3    |     1    | 

在表 PRODUCT_SOURCE 中,仅包含类型为“modif”的产品。 所以我需要从表 PRODUCTS 中获取所有产品 数量形式为 PRODUCT_SOURCE 不显示其他商店的数量(不重复),但可以按如下所示进行排序:

| id |    name    | type  | quantity |
| 3  | product-1b | modif |     7    |
| 2  | product-1a | modif |     0    |
| 6  | product-2a | modif |     0    |
| 1  | product-1  | base  |     -    |
| 4  | product-2  | base  |     -    |

我尝试过 INNER / OUTER JOIN,GROUP BY 甚至尝试将 SELECT FROM 放在 ORDER BY 子句中(我相信这是可能的......)

附:我有嵌套查询。比如:

SELECT * FROM (SELECT sp.id, sp.name, sp.type, vat.amount, source.shop_id, source.quantity, sp.created_at FROM public."product" sp FULL OUTER JOIN public."product_source" as source on sp.id = source.product_id INNER JOIN public."vat" as vat on sp.vat_id = vat.id WHERE sp.account_id = 1 AND source.shop_id = 1)AS filtered ORDER BY filtered.quantity desc

谢谢! 我将不胜感激。

【问题讨论】:

  • 如果您的查询确实是在产生错误,那么它们是什么
  • 没有错误 - *with LEFT JOIN - 它提供所有条目 - 来自表 1 和表 2(这不是我想要的,因为我需要所有表 1 和表 2 中的那些store_id 1 * with WHERE s.store_id=1 只给出表 2 中 shop_id 为 1 的人
  • 我有嵌套查询。像这样的东西总是更好地向我们展示您真正拥有的查询,而不是伪查询
  • 你是如何运行这个查询的?
  • 如果你把它放在问题中会更好。没有人可以阅读提问者下方的通讯链接中的代码。用户EDIT

标签: sql join


【解决方案1】:

架构 (MySQL v5.7)

create table PRODUCTS  (id int , name varchar(50) , type varchar(50));
insert into PRODUCTS values(1 , 'product-1' , 'base');
insert into PRODUCTS values(2 , 'product-1a' , 'modif');
insert into PRODUCTS values(3 , 'product-1b' , 'modif');
insert into PRODUCTS values(4 , 'product-2' , 'base');
                       
create table PRODUCT_SOURCE( id  int, product_id int , store_id int , quantity int);
insert into PRODUCT_SOURCE values(  1  ,      2     ,     1    ,     0    );
insert into PRODUCT_SOURCE values(  2  ,      2     ,     2    ,     5    );
insert into PRODUCT_SOURCE values(  3  ,      2     ,     3    ,     3    );
insert into PRODUCT_SOURCE values(  4  ,      3     ,     1    ,     7    );
insert into PRODUCT_SOURCE values(  5  ,      3     ,     3    ,     0    );

查询 #1

select p.id,p.name,p.type,ps.quantity from 
PRODUCTS p left join  PRODUCT_SOURCE ps on p.id=ps.product_id and store_id=1
order by p.id;
id name type quantity
1 product-1 base
2 product-1a modif 0
3 product-1b modif 7
4 product-2 base

View on DB Fiddle

如果 PRODUCT_SOURCE 表中有存储明智的产品明智的多行,那么您可以使用以下查询来获得总和(数量):

架构 (MySQL v5.7)

create table PRODUCTS  (id int , name varchar(50) , type varchar(50));
insert into PRODUCTS values(1 , 'product-1' , 'base');
insert into PRODUCTS values(2 , 'product-1a' , 'modif');
insert into PRODUCTS values(3 , 'product-1b' , 'modif');
insert into PRODUCTS values(4 , 'product-2' , 'base');
                       
create table PRODUCT_SOURCE( id  int, product_id int , store_id int , quantity int);
insert into PRODUCT_SOURCE values(  1  ,      2     ,     1    ,     0    );
insert into PRODUCT_SOURCE values(  2  ,      2     ,     2    ,     5    );
insert into PRODUCT_SOURCE values(  3  ,      2     ,     3    ,     3    );
insert into PRODUCT_SOURCE values(  4  ,      3     ,     1    ,     7    );
insert into PRODUCT_SOURCE values(  5  ,      3     ,     3    ,     0    );

查询 #1

select p.id,p.name,p.type,ps.quantity from 
PRODUCTS p left join 
(select product_id,sum(quantity) quantity 
from PRODUCT_SOURCE ps where store_id=1
group by product_id) ps
on p.id=ps.product_id;
id name type quantity
1 product-1 base
2 product-1a modif 0
3 product-1b modif 7
4 product-2 base

View on DB Fiddle

【讨论】:

  • 非常感谢!!!就是这样 - 我不知道我可以在 JOIN 子句之后使用 AND。它非常适合展示桌子! SELECT * FROM (SELECT sp.id, sp.name, sp.type, vat.amount, source.shop_id, source.quantity, sp.created_at FROM public."product" sp LEFT JOIN public."product_source" as source on sp .id = source.product_id AND source.shop_id = 1 INNER JOIN public."vat" as vat on sp.vat_id = vat.id WHERE sp.account_id = 1)AS 过滤 ORDER BY filters.quantity desc 但仍然 - 按数量排序效果不好。
  • 太好了。你做的非常出色。您的实际查询比有问题的查询要复杂得多。最良好的祝愿。
  • @nOOra 如果此答案对您有所帮助,请单击绿色复选标记接受它。谢谢。
【解决方案2】:

您可以使用相关子查询:

select p.*,
       (select ps.quantity
        from product_source ps
        where ps.product_id = p.id and ps.store_id = 1
       ) as quantity
from products p;

如果您希望所有商店都使用此功能,您可以在 from 子句中使用 cross join

select p.*,
       (select ps.quantity
        from product_source ps
        where ps.product_id = p.id and ps.store_id = s.id
       ) as quantity
from products p cross join
     stores s;

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2011-11-29
    • 2018-06-27
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多