mysql - 有更好的方法来执行此查询吗?

标签 mysql

SELECT *
FROM a
WHERE a.re_id = 3443499
AND a.id IN 
(
   SELECT b.rsp_id FROM b
   WHERE b.f_id = 9
   GROUP BY b.rsp_id
   HAVING FIND_IN_SET(16, GROUP_CONCAT(b.o_id)) > 0
   AND FIND_IN_SET(15, GROUP_CONCAT(b.o_id)) > 0

   UNION

   SELECT b.rsp_id FROM b
   WHERE b.f_id = 4
   GROUP BY b.rsp_id
   HAVING FIND_IN_SET(5, GROUP_CONCAT(b.o_id)) > 0
)
ORDER BY id DESC

这里“f_id”是数组,其值是“FIND_IN_SET”函数的第一个参数中的值。 例如

9=>(
 16,
 15
),
4=>(
 5
)

表 b 中 2 列的示例数据,2 列 f_id 和 o_id

f_id o_id
9    15
9    18
9    23
4    5
3    8

最佳答案

这个答案的要点是当前查询不运行。因此,修复语法并提出另一个问题。

首先,您可以编写查询,使其语法正确。正如所写,查询将失败,因为第一个子查询至少返回两行,而第二个子查询仅返回一行。

其次,使用 UNION ALL 而不是 UNION,除非您特别想承担删除重复项的开销。

第三,ORDER BY 将生成错误。

第四,GROUP_CONCAT() 是危险且不必要的。

我不能 100% 确定这是意图,但我会从这样的查询开始:

SELECT a.id, a.re_id
FROM a
WHERE a.re_id = 3443499 AND
      a.id IN (SELECT b.rsp_id
               FROM b
               WHERE b.f_id = 9
               GROUP BY b.rsp_id
               HAVING MAX(b.o_id = 16) > 0 AND
                      MAX(b.o_id = 15) > 0
              )
UNION ALL
SELECT b.rsp_id, NULL
FROM b
WHERE b.f_id = 4
GROUP BY b.rsp_id
HAVING MAX(b.o_id = 5) > 0
ORDER BY id;

然后,如果您希望对此进行优化,我建议您询问另一个问题,以及有关表结构和当前性能的相关信息。

关于mysql - 有更好的方法来执行此查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38804023/

相关文章:

mysql - 转义 '%' 字符时出现问题

Python,当我输入变量的实际值时,MySQL 语句有效,但在使用变量时却无效?

php - 如何使用php比较和查看mysql中的三个表?

php - 仅使用前 3 个值的数组的总和

php - 围绕 SELECT 语句的一个特定结果添加代码

MySQL select with all where and one or more where not

mysql - 如何在单个查询中获取零件总数、通过零件数和失败零件数

mysql - MySQL 中有没有办法在二进制列的子部分中使用聚合函数?

mysql - 使用连接时如何区分 sum()

MYSQL 显示最新几行,但按升序显示结果