mysql - 在 MySQL 中使用 OR 和 HAVING 与使用 AND

标签 mysql coldfusion large-data-volumes having

我正在处理 Coldfusion8/MySQL 查询,其中我正在扫描数据库中的 A-B 对,例如:

 S=2, M=2, L=2, XL=2

我正在尝试改进最初处理此问题的脚本,该脚本将条目限制为 4 对,因为我想知道为什么它首先选择具有 一个 匹配对的所有记录,然后使用 < em>HAVING 仅选择所有对匹配的记录。

这是原始查询,然后是我当前的版本:

<!--- placeholders --->
<cfparam name="s01" default="">
<cfparam name="s02" default="">
<cfparam name="s03" default="">
<cfparam name="s04" default="">
<cfparam name="q01" default="">
<cfparam name="q02" default="">
<cfparam name="q03" default="">
<cfparam name="q04" default="">
<!--- check length of user inputs --->
<cfset sizes = ListLen(s_lot_groesse,",")>
<cfset qtys   = ListLen(s_lot_menge,",")>
<!--- populate placeholders --->
<cfif sizes gt 0><cfset s01 = trim(ListGetAt(s_lot_groesse, 1,","))></cfif>
<cfif sizes gt 1><cfset s02 = trim(ListGetAt(s_lot_groesse, 2,","))></cfif>
<cfif sizes gt 2><cfset s03 = trim(ListGetAt(s_lot_groesse, 3,","))></cfif>
<cfif sizes gt 3><cfset s4 = trim(ListGetAt(s_lot_groesse, 4,","))></cfif>
<cfif qtys gt 0><cfset q01 = trim(ListGetAt(s_lot_menge, 1,","))></cfif>
<cfif qtys gt 1><cfset q02 = trim(ListGetAt(s_lot_menge, 2,","))></cfif>
<cfif qtys gt 2><cfset q03 = trim(ListGetAt(s_lot_menge, 3,","))></cfif>
<cfif qtys gt 3><cfset q04 = trim(ListGetAt(s_lot_menge, 4,","))></cfif>
<!--- query --->
<cfquery datasource="db" name="lotsuche">
SELECT styleno, count(*) as total_styles
FROM styles
WHERE 1 = 1
AND (
    <cfif s01 neq "" AND q01 neq "">(groesse = "#s01#" AND bestand >= "#q01#")</cfif>
    <cfif s02 neq "" AND q02 neq "">OR (groesse = "#s02#" AND bestand >= "#q02#")</cfif>
    <cfif s03 neq "" AND q03 neq "">OR (groesse = "#s03#" AND bestand >= "#q03#")</cfif>
    <cfif s04 neq "" AND q04 neq "">OR (groesse = "#s04#" AND bestand >= "#q04#")</cfif>
    )
GROUP BY styleno
HAVING total_styles= "#sizes#"
</cfquery>

新版本:

<!--- build a 2D array --->
<cfscript>
    variables.lotArray = ArrayNew(2);
    variables.sizeCounter = 1;
    variables.qtyCounter = 1;
</cfscript>
<cfloop list="#LOCAL.Search.s_lot_groesse#" delimiters=", " item="size">
    <cfscript>
        variables.lotArray[variables.lotCounter][1] = size;
        variables.lotCounter = variables.lotCounter + 1;
    </cfscript>
</cfloop>
<cfloop list="#LOCAL.Search.s_lot_menge#" delimiters=", " item="qty">
    <cfscript>
        variables.lotArray[variables.qtyCounter][2] = qty;
        variables.qtyCounter = variables.qtyCounter + 1;
    </cfscript>
</cfloop>
<!--- get array length --->
<cfset variables.lotArrayLen = arrayLen(variables.lotArray)>

<!--- query --->
<cfquery datasource="ds" name="lotsuche">
SELECT art.styleNo, count(*) as total_styles
FROM styles AS art
WHERE 1 = 1
<cfloop from="1" to="#variables.lotArrayLen#" index="i">
    AND ( art.groesse = <cfqueryparam cfsqltype="cfsql_varchar" value="#variables.lotArray[i][1]#"> 
    AND art.bestand >= <cfqueryparam cfsqltype="cfsql_varchar" value="#variables.lotArray[i][2]#">
</cfloop>
GROUP BY art.styleno
<!--- HAVING anzahl = "#variables.lotArrayLen#" --->
</cfquery>

问题:
我不明白为什么在原始查询中使用 ORHAVING ,因为这不会选择具有 one 匹配对的所有记录与仅选择所有对都匹配的记录?如果您有几百万个条目需要扫描,哪种方法更好/更快?另外,像我一样重新考虑整个事情是否有意义?

感谢您的帮助!

最佳答案

HAVING 子句与聚合函数一起使用,OR 用于测试查询中的多个条件。我不确定旧查询中having 子句的目的。您是否彻底测试了新查询以确保获得预期结果?

查看这两个查询后,您的第二个查询将不会以相同的方式工作。这两条记录可能有多个需要满足的条件,并且查询可能返回空记录集。

我认为您正在寻找更像这样的东西。

AND
 <cfloop from="1" to="#variables.lotArrayLen#" index="i">
 (  OR (art.groesse = <cfqueryparam cfsqltype="cfsql_varchar" value="#variables.lotArray[i][1]#"> 
AND art.bestand >= <cfqueryparam cfsqltype="cfsql_varchar" value="#variables.lotArray[i][2]#"> ) )

关于mysql - 在 MySQL 中使用 OR 和 HAVING 与使用 AND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10689595/

相关文章:

coldfusion - Coldfusion 11 和 Coldfusion 2016 之间的编码问题

java - 你如何在 Coldfusion 中使用 java 文件

SQL 错误向表添加约束,ORA-01652 - 无法扩展临时段

mysql - 来自 2 个表中的 GROUP BY 和 COUNT 的 SQL 连接结果

mysql - 按组显示值存在于字段的所有实例中的记录

php - PHP 中是否有函数或命令可以解决数据未插入 SQL 数据库的问题?

coldfusion - CFCHART : reverse Y-axis ordering

java - MySQL 查询在大型实例上发生变化 :

mysql - 从记录集中获取特定行

php - 通过php在mysql中插入数据