加入价值最低的记录

时间:2017-02-27 22:24:58

标签: mysql sql

我有两个表,用户和调查。我希望查询表用户并加入表调查,以便只为用户表中的每条记录返回具有最低值的调查记录。 我想避免使用子查询和临时表。

表用户:

--------------
| uid | name |
--------------
| 1  | mike  |
| 2  | john  |
| 3  | bill  |
--------------
表调查:

----------------------
| id | uid  | value  |
----------------------
| 1  | 3    | 9     |
| 2  | 3    | 5     |
| 3  | 1    | 3     |
| 4  | 1    | 7     |
| 5  | 1    | 2     |
| 6  | 2    | 4     |
| 7  | 2    | 9     |
| 8  | 1    | 0     |
| 9  | 2    | 5     |
---------------------

预期产出:

---------------------
| id | name | value |
---------------------
| 8  | mike | 0     |
| 2  | bill | 5     |
| 6  | john | 4     |
---------------------

我应该做什么样的JOIn,或者我应该如何编写查询?

3 个答案:

答案 0 :(得分:0)

以下查询获取具有最小值的所有行(不存在具有所选值下的值的另一个调查)

试试这个:

SELECT u.*, s.value
FROM survey s
JOIN users u
    ON s.uid = u.uid
WHERE NOT EXISTS(
    SELECT 'maximum'
    FROM survey s2
    WHERE s2.uid = s.uid
    AND s2.value < s.value)

答案 1 :(得分:0)

您可以使用以下内容:

   select s.id, u.name, y.min_value 
    from
    (
      select uid, min(value) as min_value 
      from survey 
      group by uid 
    ) y 
    join survey s 
      on s.value = y.min_value 
      and s.uid = y.uid
    join user u 
      on u.uid = y.uid

答案 2 :(得分:0)

我认为这会对你有帮助

SELECT * FROM SURVEY S
INNER JOIN  USERS U
ON S.UID=U.UID
QUALIFY ROW_NUMBER() OVER (PARTITION BY S.UID ORDER BY S.VALUE1 ASC )=1;