Mysql 组合三个SQL查询
我有以下三个SQL查询。我想将它们合并为一个是可能的,或者使用当前的方法,或者如果它更有效的话,使用另一种方法 注意:我需要知道所有三个WHERE子句的不同计数值 查询1: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
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。我听说过使用
=“不相等”的code>并不是在所有情况下都有效,但是
更好。在我的情况下,应该=代码>还好吗?这可能适合您
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中是等价的,它们之间没有区别。我将对此进行测试。只是想知道,工会不会自动分组吗?还是我在想什么