0

给定下面的表“用户”:

+----+---------+--------+
| id | name    | office |
+----+---------+--------+
|  1 | David   |      1 |
|  2 | Roz     |      1 |
|  3 | Patrick |      2 |
|  4 | Chris   |      3 |
|  5 | Agnes   |      3 |
|  6 | Freya   |      3 |
+----+---------+--------+

我想选择任何给定办公室的第一个用户,但前提是有多个用户,所以:

  • 办公室 1 = 用户 1 (大卫)
  • 办公室 2 = NULL
  • 办公室 3 = 用户 4 (克里斯)

类似于以下内容:

SET @office_id = 2;
SELECT *
  FROM `users`
WHERE `office` = @office_id AND number-of-users-for-office > 1
ORDER BY `id` ASC
LIMIT 1;
4

3 回答 3

3
SELECT  a.office, 
        MAX(
        CASE WHEN b.ID IS NULL
            THEN NULL
            ELSE a.Name
        END) Name
FROM    Tablename a
        LEFT JOIN
        (
            SELECT  office, MIN(id) ID
            FROM    Tablename
            GROUP   BY office
            HAVING  COUNT(*) > 1
        ) b ON  a.office = b.office AND
                a.ID = b.ID
-- WHERE .......                       -- (if you have extra conditions)
GROUP   BY a.office

输出

╔════════╦════════╗
║ OFFICE ║  NAME  ║
╠════════╬════════╣
║      1 ║ David  ║
║      2 ║ (NULL) ║
║      3 ║ Chris  ║
╚════════╩════════╝

子查询的目的是为每个Office. extraHAVING子句仅过滤在特定办公室内拥有超过一名员工的记录。

User然后在子查询中加入表,LEFT JOIN以获取表中的所有办公室。使用MAX()(MIN()) 聚合记录以获得每个 的单个记录office

于 2013-09-19T16:10:28.927 回答
0

我想出了另一个解决方案,我正在为后代记下。

-- Office id...
SET @office_id = 1;
-- Find the latest user
SELECT `id` INTO @latest_user_id
    FROM `users`
    WHERE `office` = @office_id
    ORDER BY `id` DESC
LIMIT 1;
-- Find the first user that isn't the first
SELECT `id` INTO @latest_user_id
    FROM `users`
    WHERE `office` = @office_id AND `id` != @latest_user_id
    ORDER BY `id` ASC
LIMIT 1;

SQL 小提琴演示

这个选择最新的,然后尝试选择与最新的不同的第一个。因此,如果只有 1 行,您将根据需要获得 NULL。

于 2013-09-27T14:04:19.597 回答
-1

编辑

SELECT `office`,if(count(`id`)>1,name,'NULL') as name
FROM (SELECT * FROM `tablename` ORDER BY id ASC)
`tablename`
GROUP BY `office`
ORDER BY `id` ASC
于 2013-09-19T16:28:24.283 回答