Mysql e、 对于底部查询,我认为对于顶部查询,它将改变结果。@Johan:因为st2.相关字段不是NULL(它已经包含在ON子句中),它不会改变结果。@ypercube,所以您可以将count(afield)更改为count(*)如果您确定afield永远不会为
Mysql e、 对于底部查询,我认为对于顶部查询,它将改变结果。@Johan:因为st2.相关字段不是NULL(它已经包含在ON子句中),它不会改变结果。@ypercube,所以您可以将count(afield)更改为count(*)如果您确定afield永远不会为,mysql,subquery,where-in,Mysql,Subquery,Where In,e、 对于底部查询,我认为对于顶部查询,它将改变结果。@Johan:因为st2.相关字段不是NULL(它已经包含在ON子句中),它不会改变结果。@ypercube,所以您可以将count(afield)更改为count(*)如果您确定afield永远不会为null,明白了。Thanks@quano是,它列出了所有重复项,因为分组依据位于st1.id上,而不是位于st1.relevant_字段。是的,这可能会创建一个包含分组结果的临时表,因此速度与查看版本相同。但是查询计划应该说实话,这对我来说非
e、 对于底部查询,我认为对于顶部查询,它将改变结果。@Johan:因为
st2.相关字段不是NULL
(它已经包含在ON
子句中),它不会改变结果。@ypercube,所以您可以将count(afield)更改为count(*)如果您确定afield
永远不会为null
,明白了。Thanks@quano是,它列出了所有重复项,因为分组依据
位于st1.id
上,而不是位于st1.relevant_字段
。是的,这可能会创建一个包含分组结果的临时表,因此速度与查看版本相同。但是查询计划应该说实话,这对我来说非常有效。我在一个IN(子查询)中有另一个IN(子查询),它花费了超过10分钟的时间,以至于我在等待的时候用谷歌搜索。按照您的建议,在SELECT*FROM()中包装每个子查询将其缩短为2秒!谢谢你,我一直在想一个好办法来做这几小时了。这很有效。但愿我能给你更多的选票!这绝对应该是答案。效果非常好。一个耗时约50秒的查询现在是即时的。但愿我能投更多的票。有时候你不能使用连接,所以这是正确的答案。我想知道为什么优化器会考虑与联合相关的查询。。。不管怎样,这个技巧就像魔法一样有效。你能解释一下是什么使它成为一个相关子查询吗?我的理解是,当子查询使用一个依赖于外部查询的值时,它就会变得相关。但在这个例子中,我看不到任何相互依赖性。它将为外部查询返回的每一行提供相同的结果。我在MariaDB上实现了一个类似的示例,我看不出性能有什么影响(到目前为止),所以我想清楚地看到,什么时候需要这个SELECT*
wrapping。
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
SELECT *
FROM some_table
WHERE
relevant_field in
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT ( * ) > 1
);
SELECT *
FROM some_table as t1
WHERE
t1.relevant_field in
(
SELECT t2.relevant_field
FROM some_table as t2
GROUP BY t2.relevant_field
HAVING COUNT ( t2.relevant_field ) > 1
);
SELECT st1.*
FROM some_table st1
inner join
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)st2 on st2.relevant_field = st1.relevant_field;
SELECT st1.*, st2.relevant_field FROM sometable st1
INNER JOIN sometable st2 ON (st1.relevant_field = st2.relevant_field)
GROUP BY st1.id /* list a unique sometable field here*/
HAVING COUNT(*) > 1
SELECT * FROM sometable a WHERE EXISTS (
SELECT 1 FROM sometable b
WHERE a.relevant_field = b.relevant_field
GROUP BY b.relevant_field
HAVING count(*) > 1)
SELECT * FROM
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
) AS subquery
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT * FROM
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
) AS subquery
)
SELECT t1.*
FROM
some_table t1,
(SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT (*) > 1) t2
WHERE
t1.relevant_field = t2.relevant_field;
SELECT STRAIGHT_JOIN table.field FROM table WHERE table.id IN (...)
`select DATE_FORMAT(L.TANGGAL_INPUT,'%d-%m-%y') AS TANGGAL,
L.TRANSACTION_NUMBER AS VOUCHER,
L.ACCOUNT_CODE,
C.DESCRIPTION,
L.DEBET,
L.KREDIT
from (select * from tabel_buku_besar A
where A.COMPANYAREA='$COMPANYAREA'
AND A.CURRENCY='$Currency'
AND A.ACCOUNT_CODE!='$ACCOUNT'
AND (A.TANGGAL_INPUT BETWEEN STR_TO_DATE('$StartDate','%d/%m/%Y') AND STR_TO_DATE('$EndDate','%d/%m/%Y'))) L
INNER JOIN (select * from tabel_buku_besar A
where A.COMPANYAREA='$COMPANYAREA'
AND A.CURRENCY='$Currency'
AND A.ACCOUNT_CODE='$ACCOUNT'
AND (A.TANGGAL_INPUT BETWEEN STR_TO_DATE('$StartDate','%d/%m/%Y') AND STR_TO_DATE('$EndDate','%d/%m/%Y'))) R ON R.TRANSACTION_NUMBER=L.TRANSACTION_NUMBER AND R.COMPANYAREA=L.COMPANYAREA
LEFT OUTER JOIN master_account C ON C.ACCOUNT_CODE=L.ACCOUNT_CODE AND C.COMPANYAREA=L.COMPANYAREA
ORDER BY L.TANGGAL_INPUT,L.TRANSACTION_NUMBER`
SELECT * FROM primary_table st1
LEFT JOIN comparision_table st2 ON (st1.relevant_field = st2.relevant_field)
WHERE st2.primaryKey IS NOT NULL