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/