有人能帮我把它弄得又简单又快吗?
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分钟才显示给我一个空数据
3条答案
按热度按时间bbmckpt71#
Using
是一种连接列名相同的列的方便方法。由于using
和on
是不兼容的选项,我将barcode
条件放在where
中,因为它是内部连接,所以与连接条件具有相同的效果。MySQL允许稍后使用像
k2count
这样的计数别名,因此部分简化如下:这里还需要做一些工作,就像您按
trannum
分组一样,假设它不是主键,您希望它显示哪些k1.{sto,mm,dd,yy,sto_name}
字段。(请参见不要禁用only_full_group_by。正确的索引将有助于查询。参见Rick的ROT,索引,或将
show create table trans012020
添加到您的问题中。qnzebej02#
请记住
JOIN
和GROUP BY
是如何一起工作的。* 首先 *JOINs
完成了。这将扩展为一个大的temp表。* 其次 *GROUP BY
将id缩小到您开始时的大小。让我们避免“inflate-deflate”:如果
barcode
是NOT NULL
,则将count(k2.barcode)
简单地更改为COUNT(*)
。k1需要一个
INDEX
(或以barcode
开头的PRIMARY KEY)
。如果k2 count永远不能大于1,那么有一个更好的方法:
是的,这对于
k2
是理想的:(The列的顺序对于此查询并不重要 *。)
请注意,
GROUP BY
消失了。bjp0bcyl3#
以下是我的想法,我没有进行概念验证,而是从文档中了解到的
select是评估所有的东西,直到group by,这个平均值是对数据库中的所有东西进行分组,而不考虑having条件。
我的建议是你试着像
希望这能让你得到想要的结果
下面是一些关于如何评估这些属性的文档
https://www.mysqltutorial.org/mysql-having.aspx