mysql—如何创建一个sql来创建一个报表,该报表选择所有带有一个行项目的引号,如果在该引号上,则包含另一个项目?

cpjpxq1n  于 2021-06-21  发布在  Mysql
关注(0)|答案(4)|浏览(240)

我有两张表:报价表和项目表。
报价表

id | quote_number
---+-------
 1 |   100 
 2 |   200

项目表

id | model | quote_id | other_data 
---+-------+----------+-----------
 1 |   ABC | 1        | xxx
 2 |  DISC | 1        | xxx
 3 |   ABC | 2        | xxx
 4 |  DISC | 2        | xxx
 3 |   XXX | 3        | xxx
 4 |  DISC | 3        | xxx
 3 |   ABC | 4        | xxx

我需要创建一个报告,从中选择必须包含模型的所有引号 ABC 如果他们有,我也希望列出模型 DISC 属于那句话。我想列出所有这样的项目行。怎样?
用通俗易懂的英语说就是“给我所有型号的报价,可能还有折扣(折扣)。
示例报告

quote_id | model | other_data 
---------+-------+---------+-
 1       |   ABC | xxx
 1       |  DISC | xxx
 2       |   ABC | xxx
 2       |  DISC | xxx

到目前为止,我只知道如何用 ABC 但我不知道怎么把线拉进去 DISC ,条件为“必须将连接到同一报价”。

b0zn9rqh

b0zn9rqh1#

您应该考虑join语句:

SELECT quote_id, model, other_data FROM item i INNER JOIN quote q ON i.id = q.quote_id WHERE model = 'ABC' or model = 'DISC' ORDER BY quote_id DESC;
djmepvbi

djmepvbi2#

您可以使用子查询,如果您使用的是mysql 8.0,那么也可以使用cte

SELECT it.quote_id, it.model, it.other_data
FROM item it INNER JOIN (
    SELECT quote_id 
    FROM item i WHERE model = 'ABC') as sub_it 
ON it.quote_id=sub_it.quote_id 
WHERE it.model='ABC' OR it.model='DISC'
ORDER BY it.quote_id DESC;

小提琴

a14dhokn

a14dhokn3#

UNION ALL 似乎是个好办法:

select ia.*
from items ia
where ia.model = 'ABC'
union all
select id.*
from items id
where id.model = 'DISC' and
      exists (select 1 from items ia where ia.quote_id = id.quote_id and ia.model = 'ABC')
order by quote_id, model;

这种逻辑可以利用 items(model) 以及 items(quote_id, model) . 这个 order by 任何解决方案都需要。

flseospp

flseospp4#

我认为子查询方法是最简单、最干净的方法。我不喜欢使用或条件,所以我使用了in列表。

SELECT
        quote_id,
        model,
        other_data
     FROM item 
    Where  quote_id in ( SELECT quote_id FROM item i WHERE model = 'ABC' )
      AND  model IN ('ABC', 'DISC')
    ORDER BY 1,2;

相关问题