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
答案 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;
然后,如果您希望进行此优化,我建议您询问另一个问题,以及有关表结构和当前性能的相关信息。