我有一个包含经理ID和员工ID(以逗号分隔)的表,我有以下sql语句:
SELECT manager_id, staff_ids FROM manager_staffs WHERE 1 IN (staff_ids) OR 3 IN (staff_ids) OR 5 IN (staff_ids) OR 23 IN (staff_ids) OR 12 IN (staff_ids) OR 16 IN (staff_ids) OR 19 IN (staff_ids) OR 32 IN (staff_ids) OR 123 IN (staff_ids) ............
基本上,这是一个非常长的查询,有很多' OR'条件。如果有办法,我想改进或缩短它。
需要所有sql专家的帮助。
答案 0 :(得分:1)
问题在于您的数据结构 - 不要将所有人员ID放在一列中。制作一张桌子 - 你可以称之为manager_staff:
CREATE TABLE manager_staff (
manager_id int,
staff_id int
);
因此,您可以制作记录,显示每个员工报告的经理。然后您的查询变为:
select manager_id, staff_id from manager_staff where staff_id in (1,3,...);
答案 1 :(得分:0)
为什么不尝试这个
SELECT manager_id, staff_ids
FROM manager_staffs
WHERE staff_ids IN (1,3,5,23,12,16,19,32,123,.......)
除非您创建其他表并选择上面的查询,否则您无法选择如何缩减OR
。
结构表最适合在检索数据时获得性能。
你的桌子应该是那样的
manager_staff
manager_id , staff_id
1 1
1 3
1 5
1 23
..........
答案 2 :(得分:0)
我不确定你想要实现什么,但试试这个:
SELECT manager_id,staff_ids 来自manager_staffs 其中staff_ids('1','3'等)
答案 3 :(得分:0)
假设staff_ids是逗号分隔字段,那么您可以执行以下操作。
SELECT DISTINCT manager_id, staff_ids
FROM manager_staffs a
INNER JOIN (SELECT 1 AS staff_id UNION SELECT 3 UNION SELECT 5 UNION SELECT 23 UNION SELECT 12 UNION SELECT 16 UNION SELECT 19 UNION SELECT 32 UNION SELECT 123) b
ON FIND_IN_SET(b.staff_id, a.staff_ids) > 0
但正如我之前评论过的那样,将其拆分将是一个更好的主意