仅在一列上不同 - 仅显示第一个重复行


Distinct on only one column - only display FIRST duplicate row

我在 PHP 中使用 SQL 查询来显示我的"users"表中的 5 列。这是我的代码:

SELECT DISTINCT account_id, full_name, email, login, phone, updated_at, last_request_at, unconfirmed_email FROM $table WHERE id < '300'

基本上,此表有 2 种类型的用户 - 管理员帐户和我们称之为"子用户" - 他们仍然是用户,但他们没有管理员权限,并且他们是由他们的父管理员帐户创建的。因此,父管理员帐户及其子用户共享相同的"account_id" 这里有一个例子(对不起,它是垃圾):

| account_id | full_name   | Superhero?  |
| 1          | Batman      |  1          |
| 1          | Robin       |  1          |
| 1          | Magneto     |  0          |
| 2          | Spiderman   |  1          |
| 2          | The Hulk    |  1          |
| 2          | Wolverine   |  1          |
| 3          | Professor X |  1          |
| 4          | Cyclops     |  1          |
| 4          | Shrek       |  0          |
| 4          | Superman    |  1          |
| 4          | Bob         |  0          |

所以你可以假装蜘蛛侠制作了绿巨人和金刚狼的账户。这告诉我蜘蛛侠有一个管理员帐户,因为他是account_id"2"的第一个实例。

如您所见,虽然full_name是唯一的,但有许多重复的account_id,我想对其进行优化,以便它仅显示每个ID的第一个实例 - 只有4个不同的account_id,因此它应该只显示4个条目,如下所示:

| account_id | full_name   | Superhero?  |
| 1          | Batman      |  1          |
| 2          | Spiderman   |  1          |
| 3          | Professor X |  1          |
| 4          | Cyclops     |  1          |

我怎样才能做到这一点?

您可能应该添加另一列。现在可以使用GROUP BY子句为每个account_id获取不同的记录,但所有非聚合列的结果可能不明确。您必须在组内有一些您批准的顺序或指示,以确定每个accout_id的哪条记录是"第一个"。使用列标记每个组中的哪个记录是第一个查询很简单。没有它,您必须接受一些订单告诉查询哪个记录是"第一个"。在full_name的字母顺序上:

SELECT account_id, 
       full_name, 
       email, 
       login, 
       phone, 
       updated_at, 
       last_request_at, 
       unconfirmed_email 
  FROM table1 WHERE full_name IN (
    SELECT MIN(full_name) 
      FROM table1 
      GROUP BY account_id 
      WHERE id < '300'
  )

这是您要求的解决方案,

SELECT account_id,full_name,Superhero
FROM(
SELECT p.*,( 
            CASE account_id 
            WHEN @curType 
            THEN @curRow := @curRow + 1 
            ELSE @curRow := 1 AND @curType := account_id END
          ) + 1 AS rank
FROM      test p, (SELECT @curRow := 0, @curType := '', @curRank := 0) r) A
WHERE rank=2;

Sql_Demo

输出:

ACCOUNT_ID  FULL_NAME   SUPERHERO
1             Batman    1
2            Spiderman  1
3           Professor X 1
4            Cyclops    1

试试这个

select * from table1
group by account_id

演示在这里

这将为您提供每个account_id中的第一个