当有多个行查询相同的列数据且仅在一列中有所不同时,如何确定要获取的行的优先级?
例如,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
=是和否时,则应选择唯一的一个。
答案 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
函数。