有没有更好的方法来执行此查询?

时间:2016-08-06 11:55:33

标签: 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

1 个答案:

答案 0 :(得分:0)

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

首先,您可以编写查询,使其在语法上正确。查询将按写入方式失败,因为第一个子查询至少返回两行而第二个只返回一行。

其次,使用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;

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