2

同じ列データがクエリされ、1 つの列だけが異なる複数の行がある場合に、フェッチする行の優先順位を付ける方法は?

たとえば、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;

結果が 1 つの行のみになる他の emp_id があり、時にはis_primary='No' の値を選択する必要があります (他の選択肢はis_primaryありません)。唯一選ばれる。

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 に答える