Mysql 组合三个SQL查询

Mysql 组合三个SQL查询,mysql,sql,Mysql,Sql,我有以下三个SQL查询。我想将它们合并为一个是可能的,或者使用当前的方法,或者如果它更有效的话,使用另一种方法 注意:我需要知道所有三个WHERE子句的不同计数值 查询1: SElECT COUNT(*) AS imgCount FROM ( SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images UNION ALL SELECT imgHeight, imgWidth, primaryId

我有以下三个SQL查询。我想将它们合并为一个是可能的,或者使用当前的方法,或者如果它更有效的话,使用另一种方法

注意:我需要知道所有三个WHERE子句的不同计数值

查询1:

SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth = $maxImageWidth AND imgHeight = $maxImageHeight;
SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth = $maxImageWidth AND imgHeight != $maxImageHeight;
SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth != $maxImageWidth AND imgHeight = $maxImageHeight;
查询2:

SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth = $maxImageWidth AND imgHeight = $maxImageHeight;
SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth = $maxImageWidth AND imgHeight != $maxImageHeight;
SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth != $maxImageWidth AND imgHeight = $maxImageHeight;
查询3:

SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth = $maxImageWidth AND imgHeight = $maxImageHeight;
SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth = $maxImageWidth AND imgHeight != $maxImageHeight;
SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth != $maxImageWidth AND imgHeight = $maxImageHeight;


另外,我的数据库是MySQL。我听说过使用
=并不是在所有情况下都有效,但是
更好。在我的情况下,应该
=还好吗?

这可能适合您

SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId 
AND (imgWidth != $maxImageWidth AND imgHeight = $maxImageHeight
OR imgWidth = $maxImageWidth AND imgHeight != $maxImageHeight
OR imgWidth = $maxImageWidth AND imgHeight = $maxImageHeight);
我也相信这是等效的,尽管我不确定

SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId 
AND (imgWidth = $maxImageWidth OR imgHeight = $maxImageHeight);
根据请求,这里有一个返回3行的查询

SELECT 'ALL EQUAL' AS COL1,COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth = $maxImageWidth AND imgHeight = $maxImageHeight
UNION ALL
SELECT 'WIDTH EQUAL' AS COL1,COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth = $maxImageWidth AND imgHeight != $maxImageHeight;
UNION ALL
SELECT 'HEIGHT EQUAL' AS COL1,COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images  
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth != $maxImageWidth AND imgHeight = $maxImageHeight;

这可能对你有用

SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId 
AND (imgWidth != $maxImageWidth AND imgHeight = $maxImageHeight
OR imgWidth = $maxImageWidth AND imgHeight != $maxImageHeight
OR imgWidth = $maxImageWidth AND imgHeight = $maxImageHeight);
我也相信这是等效的,尽管我不确定

SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId 
AND (imgWidth = $maxImageWidth OR imgHeight = $maxImageHeight);
根据请求,这里有一个返回3行的查询

SELECT 'ALL EQUAL' AS COL1,COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth = $maxImageWidth AND imgHeight = $maxImageHeight
UNION ALL
SELECT 'WIDTH EQUAL' AS COL1,COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth = $maxImageWidth AND imgHeight != $maxImageHeight;
UNION ALL
SELECT 'HEIGHT EQUAL' AS COL1,COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images  
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) AS union_table
WHERE primaryId = $imgId AND imgWidth != $maxImageWidth AND imgHeight = $maxImageHeight;

我认为需要一个案例和一个小组:

SELECT CASE
       WHEN imgWidth  = $maxImageWidth AND imgHeight  = $maxImageHeight
       THEN 0
       WHEN imgWidth != $maxImageWidth AND imgHeight  = $maxImageHeight
       THEN 1
       WHEN imgWidth  = $maxImageWidth AND imgHeight != $maxImageHeight
       THEN 2
       END AS count_type,
       COUNT(*) AS imgCount
  FROM (SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
        UNION ALL 
        SELECT imgHeight, imgWidth, primaryId FROM secondary_images
       ) AS union_table
 WHERE primaryId = $imgId
   AND (imgWidth = $maxImageWidth OR imgHeight = $maxImageHeight)
 GROUP BY count_type;
将WHERE子句下推到UNION子查询中至少是很有诱惑力的,但是优化器无论如何都应该这样做。通过研究解释输出来检查它是否做到了这一点。如果优化器没有自动执行谓词下推,您将编写:

SELECT CASE
       WHEN imgWidth  = $maxImageWidth AND imgHeight  = $maxImageHeight
       THEN 0
       WHEN imgWidth != $maxImageWidth AND imgHeight  = $maxImageHeight
       THEN 1
       WHEN imgWidth  = $maxImageWidth AND imgHeight != $maxImageHeight
       THEN 2
       END AS count_type,
       COUNT(*) AS imgCount
  FROM (SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
         WHERE primaryId = $imgId  -- or: imgId = $imgId
           AND (imgWidth = $maxImageWidth OR imgHeight = $maxImageHeight)
        UNION ALL 
        SELECT imgHeight, imgWidth, primaryId FROM secondary_images
         WHERE primaryId = $imgId
           AND (imgWidth = $maxImageWidth OR imgHeight = $maxImageHeight)
       ) AS union_table
 GROUP BY count_type;

此解决方案的缺点是,
$maxImageWidth
$maxImageHeight
变量分别使用了4次(和
$imgId
一次)。如果您正在准备如图所示的语句(将值嵌入表示SQL的字符串中),那么还不错。如果您正在使用占位符,则可能需要占位符的命名方案(
:img\u ht
:img\u wd
:img\u id
(或至少
:1
:2
:3
)来代替
占位符),以便在EXECUTE语句中只传递每个值一次。不过,这种能力取决于您的DBMS;MySQL是许多不支持此功能的DBMS之一。

我认为需要一个案例和一个分组:

SELECT CASE
       WHEN imgWidth  = $maxImageWidth AND imgHeight  = $maxImageHeight
       THEN 0
       WHEN imgWidth != $maxImageWidth AND imgHeight  = $maxImageHeight
       THEN 1
       WHEN imgWidth  = $maxImageWidth AND imgHeight != $maxImageHeight
       THEN 2
       END AS count_type,
       COUNT(*) AS imgCount
  FROM (SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
        UNION ALL 
        SELECT imgHeight, imgWidth, primaryId FROM secondary_images
       ) AS union_table
 WHERE primaryId = $imgId
   AND (imgWidth = $maxImageWidth OR imgHeight = $maxImageHeight)
 GROUP BY count_type;
将WHERE子句下推到UNION子查询中至少是很有诱惑力的,但是优化器无论如何都应该这样做。通过研究解释输出来检查它是否做到了这一点。如果优化器没有自动执行谓词下推,您将编写:

SELECT CASE
       WHEN imgWidth  = $maxImageWidth AND imgHeight  = $maxImageHeight
       THEN 0
       WHEN imgWidth != $maxImageWidth AND imgHeight  = $maxImageHeight
       THEN 1
       WHEN imgWidth  = $maxImageWidth AND imgHeight != $maxImageHeight
       THEN 2
       END AS count_type,
       COUNT(*) AS imgCount
  FROM (SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
         WHERE primaryId = $imgId  -- or: imgId = $imgId
           AND (imgWidth = $maxImageWidth OR imgHeight = $maxImageHeight)
        UNION ALL 
        SELECT imgHeight, imgWidth, primaryId FROM secondary_images
         WHERE primaryId = $imgId
           AND (imgWidth = $maxImageWidth OR imgHeight = $maxImageHeight)
       ) AS union_table
 GROUP BY count_type;

此解决方案的缺点是,
$maxImageWidth
$maxImageHeight
变量分别使用了4次(和
$imgId
一次)。如果您正在准备如图所示的语句(将值嵌入表示SQL的字符串中),那么还不错。如果您正在使用占位符,则可能需要占位符的命名方案(
:img\u ht
:img\u wd
:img\u id
(或至少
:1
:2
:3
)来代替
占位符),以便在EXECUTE语句中只传递每个值一次。不过,这种能力取决于您的DBMS;MySQL是许多不支持此功能的DBMS之一。

在主映像和次映像表中是否有primaryId索引?如果是,那么应该将where子句推到内部,以便可以使用索引

SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images WHERE imgId = $imgId AND imgWidth != $maxImageWidth AND imgHeight = $maxImageHeight 
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images WHERE primaryId = $imgId AND imgWidth != $maxImageWidth AND imgHeight = $maxImageHeight
) AS union_table

否则将进行完整的表扫描以查找imgId,因为union_表是由Mysql创建的临时表,没有任何索引。

在主映像和次映像表中是否有primaryId索引?如果是,那么应该将where子句推到内部,以便可以使用索引

SElECT COUNT(*) AS imgCount FROM (
    SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images WHERE imgId = $imgId AND imgWidth != $maxImageWidth AND imgHeight = $maxImageHeight 
    UNION ALL 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images WHERE primaryId = $imgId AND imgWidth != $maxImageWidth AND imgHeight = $maxImageHeight
) AS union_table

否则将进行完整的表扫描以查找imgId,因为union_表是由Mysql创建的临时表,没有任何索引。

谢谢您的回答。好奇的是,这会给我提供三种不同的价值观吗?我想我应该在问题中提到这一点。我需要知道所有三个WHERE子句的不同计数值。另外,我有点不确定为什么在WHERE子句中,下面的行
和($imgId AND
中有
$imgId
?不,这只会提供1个值,如果您想要3个不同的值,请稍等片刻,我为您撰写一个答案。此外,您可能注意到,我编辑了“$imgId AND”部分out@stefmikhail您应该循环抛出结果集。实际上有三个数组:)@stefmikhail是的,但是您应该与
mysql\u fetch\u assoc
:)@stefmikhail
一起使用循环,而($row=mysql\u fetch\u assoc($result)){$cnt[$row['COL1']=$row['imgCount'];}
。现在您将有一个包含三个值的数组:
$cnt['ALL EQUAL']
$cnt['WIDTH EQUAL']
$cnt['HEIGHT EQUAL']
。谢谢您的回答。好奇的是,这会给我提供三种不同的价值观吗?我想我应该在问题中提到这一点。我需要知道所有三个WHERE子句的不同计数值。另外,我有点不确定为什么在WHERE子句中,下面的行
和($imgId AND
中有
$imgId
?不,这只会提供1个值,如果您想要3个不同的值,请稍等片刻,我为您撰写一个答案。此外,您可能注意到,我编辑了“$imgId AND”部分out@stefmikhail您应该循环抛出结果集。实际上有三个数组:)@stefmikhail是的,但是您应该与
mysql\u fetch\u assoc
:)@stefmikhail
一起使用循环,而($row=mysql\u fetch\u assoc($result)){$cnt[$row['COL1']=$row['imgCount'];}
。现在您将有一个包含三个值的数组:
$cnt['ALL EQUAL']
$cnt['WIDTH EQUAL']
$cnt['HEIGHT EQUAL']
=
在MySQL中是等价的,它们之间没有区别。
=
在MySQL中是等价的,它们之间没有区别。我将对此进行测试。只是想知道,工会不会自动分组吗?还是我在想什么