需要帮助来缩短mysql的多个OR条件

时间:2013-07-17 10:25:57

标签: mysql

我有一个包含经理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专家的帮助。

4 个答案:

答案 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

但正如我之前评论过的那样,将其拆分将是一个更好的主意