24

SQL MIN() 関数を GROUP BY と共に使用する場合、追加の列 (MIN 列または GROUP BY 列の 1 つ以外) は、一致する MIN 行のデータと一致しますか?

たとえば、部署名、従業員名、および給与を含むテーブルがあるとします。

SELECT MIN(e.salary), e.* FROM employee e GROUP BY department

明らかに、最低給与と部門という 2 つの適切な列が得られます。従業員名 (およびその他の従業員フィールド) は同じ行から取得されますか? つまり、MIN(給与)の行ですか?

同じ (そして最も低い) 給与の従業員が 2 人存在する可能性が高いことはわかっていますが、(現在) 関心があるのは、最も安い従業員(または1 人の) に関するすべての情報を取得することだけです。

これは最も安いセールスマンを選ぶでしょうか?

SELECT min(salary), e.* FROM employee e WHERE department = 'sales'

基本的に、MIN() 関数とともに返されるデータが、その最小値を持つ(または単一の) レコードと一致することを確認できますか?

データベースが重要な場合は、MySql を使用しています。

4

4 に答える 4

1
SELECT  e.*
FROM    employee e
WHERE   e.id =
        (
        SELECT  id
        FROM    employee ei
        WHERE   ei.department = 'sales'
        ORDER BY
                e.salary
        LIMIT 1
        )

各部門の値を取得するには、次を使用します。

SELECT  e.*
FROM    department d
LEFT JOIN
        employee e
ON   e.id =
        (
        SELECT  id
        FROM    employee ei
        WHERE   ei.department = d.id
        ORDER BY
                e.salary
        LIMIT 1
        )

従業員がいる部門の値のみを取得するには、次を使用します。

SELECT  e.*
FROM    (
        SELECT  DISTINCT eo.department
        FROM    employee eo
        ) d
JOIN
        employee e
ON   e.id =
        (
        SELECT  id
        FROM    employee ei
        WHERE   ei.department = d.department
        ORDER BY
                e.salary
        LIMIT 1
        )

もちろん、インデックスをオンに(department, salary)すると、3 つのクエリすべてが大幅に改善されます。

于 2009-04-06T20:25:44.783 に答える
0

最速のソリューション:

SET @dep := '';
SELECT * FROM (
  SELECT * FROM `employee` ORDER BY `department`, `salary`
) AS t WHERE IF ( @dep = t.`department`, FALSE, ( @dep := t.`department` ) OR TRUE );
于 2012-07-17T19:43:18.890 に答える