mysql 有人能帮我简化这个语法吗

new9mtju  于 2023-02-21  发布在  Mysql
关注(0)|答案(3)|浏览(159)

有人能帮我把它弄得又简单又快吗?

select k1.sto, k1.mm,k1.dd, k1.yy, k1.sto_name, k1.trannum,
  count(k2.barcode) 
from trans012020 as k1 , trans012020 as k2 
where k1.barcode=123456789 
  and k1.mm=k2.mm
  and k1.dd=k2.dd
  and k1.yy=k2.yy
  and k1.sto=k2.sto
  and k1.trannum=k2.trannum 
group by k1.trannum
having count(k2.barcode)=1;

如果我运行它,它应该会显示我需要的所有详细信息where count(barcode)=1
它显示了我所需要的,但是花了6分钟才显示了5行数据。
而且花了6分钟才显示给我一个空数据

bbmckpt7

bbmckpt71#

Using是一种连接列名相同的列的方便方法。由于usingon是不兼容的选项,我将barcode条件放在where中,因为它是内部连接,所以与连接条件具有相同的效果。
MySQL允许稍后使用像k2count这样的计数别名,因此部分简化如下:

select k1.sto, k1.mm,k1.dd, k1.yy, k1.sto_name, k1.trannum,
  count(k2.barcode) as k2count
from trans012020 as k1 
join trans012020 as k2 
  using (mm,dd,yy,sto,trannum)
where k1.barcode=123456789 
group by k1.trannum
having k2count=1;

这里还需要做一些工作,就像您按trannum分组一样,假设它不是主键,您希望它显示哪些k1.{sto,mm,dd,yy,sto_name}字段。(请参见不要禁用only_full_group_by。
正确的索引将有助于查询。参见Rick的ROT,索引,或将show create table trans012020添加到您的问题中。

qnzebej0

qnzebej02#

请记住JOINGROUP BY是如何一起工作的。* 首先 * JOINs完成了。这将扩展为一个大的temp表。* 其次 * GROUP BY将id缩小到您开始时的大小。让我们避免“inflate-deflate”:

select  k1.sto, k1.mm,k1.dd, k1.yy, k1.sto_name, k1.trannum,
        ( SELECT count(k2.barcode) FROM trans012020 as k2
              WHERE k1.mm=k2.mm
                and k1.dd=k2.dd
                and k1.yy=k2.yy
                and k1.sto=k2.sto
                and k1.trannum=k2.trannum 
        ) as k2count
    from  trans012020 as k1
    where  k1.barcode=123456789
    having  k2count=1;

如果barcodeNOT NULL,则将count(k2.barcode)简单地更改为COUNT(*)
k1需要一个INDEX(或以barcode开头的PRIMARY KEY)
如果k2 count永远不能大于1,那么有一个更好的方法:

select  k1.sto, k1.mm,k1.dd, k1.yy, k1.sto_name, k1.trannum
    from  trans012020 as k1
    where  k1.barcode=123456789
      AND EXISTS ( SELECT 1 FROM FROM trans012020 as k2
              WHERE k1.mm=k2.mm
                and k1.dd=k2.dd
                and k1.yy=k2.yy
                and k1.sto=k2.sto
                and k1.trannum=k2.trannum )

是的,这对于k2是理想的:

INDEX(mm, dd, yy, sto, trannum)

(The列的顺序对于此查询并不重要 *。)
请注意,GROUP BY消失了。

bjp0bcyl

bjp0bcyl3#

以下是我的想法,我没有进行概念验证,而是从文档中了解到的
select是评估所有的东西,直到group by,这个平均值是对数据库中的所有东西进行分组,而不考虑having条件。
我的建议是你试着像

select k1.sto,k1.mm,k1.dd,k1.yy,k1.sto_name,k1.trannum,count(k2.barcode) from trans012020 as k1 , trans012020 as k2 
where 
count(k2.barcode)=1 and
k1.barcode=123456789 and k1.mm=k2.mm and k1.dd=k2.dd and k1.yy=k2.yy and k1.sto=k2.sto and k1.trannum=k2.trannum 
group by k1.trannum;

希望这能让你得到想要的结果
下面是一些关于如何评估这些属性的文档
https://www.mysqltutorial.org/mysql-having.aspx

相关问题