如果另一行包含相同的列数据,则仅选择所需的行

时间:2013-08-15 08:25:24

标签: mysql

当有多个行查询相同的列数据且仅在一列中有所不同时,如何确定要获取的行的优先级?

例如,is_primary列是优先级的基础:

--------------------------------
emp_id | position | is_primary |
--------------------------------
00001  | 1        | Yes        |
--------------------------------
00001  | 2        | No         |
--------------------------------

可能很容易说添加条件WHERE is_primary =&#39;是&#39;,但我想要的是选择主要位置当且仅当有多次出现emp_id时。< / p>

这是我的查询,有时会显示错误的员工位置:

SELECT a.emp_id, employee.getEmpName(a.emp_id) as full_name, b.position 
FROM `employee.info` a LEFT JOIN `employee.positions` b on b.emp_id=a.emp_id 
WHERE a.status!='Resigned' 
GROUP BY a.emp_id 
ORDER BY position,full_name;

还有其他的emp_id只会在一行中生成,有时is_primary =&#39;否&#39;应该选择哪个(没有其他选择),但是当emp_id分别出现在两行中is_primary =是和否时,则应选择唯一的一个。

2 个答案:

答案 0 :(得分:1)

将表连接到自身,但不是同一行:

SELECT distinct a.emp_id, employee.getEmpName(a.emp_id) as full_name, b.position 
FROM `employee.info` a
JOIN `employee.info` a2 on a2.emp_id=a.emp_id
    AND a2.is_primary != 'Yes'
LEFT JOIN `employee.positions` b on b.emp_id=a.emp_id
WHERE a.status!='Resigned'
AND a.is_primary = 'Yes'
GROUP BY a.emp_id 
ORDER BY position,full_name;

答案 1 :(得分:0)

Positions表:

emp_id     varchar(5)
position   int(11)
is_primary tinyint(1)  

定位表数据:

00001 1 1
00001 2 0  

查询:

SELECT * FROM `positions`
WHERE
    `emp_id` = '00001' AND
    `position` = (
        SELECT MIN(`position`) FROM `positions` WHERE `emp_id` = '00001'
     )  

输出:

00001 1 1  

如果你想获得最小位置的行 如果您希望获得具有最大位置的行,请使用MAX函数。