2

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

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

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

说添加条件 WHERE is_primary='Yes' 可能很容易,但我想要的是当且仅当 emp_id 多次出现时才选择主要位置。

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

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应该选择 ='No' 的值(没有其他选择),但是当 emp_id 出现在分别具有is_primary= Yes 和 No 的两行时,Yes 应该唯一被选中的。

4

2 回答 2

2

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

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;
于 2013-08-15T08:37:10.470 回答
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功能的行。

于 2013-08-15T08:44:59.280 回答