仅在一列上有区别 - 仅显示第一个重复行

时间:2013-09-13 09:44:49

标签: php mysql sql

我在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'

基本上,这个表有两种类型的用户 - 管理员帐户和我们称之为“子用户” - 他们仍然是用户,但他们没有管理员权限,而且他们是由他们的父管理员帐户创建的。因此,父管理员帐户及其子用户都共享相同的“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          |

所以你可以假装蜘蛛侠制作了The Hulk's和Wolverine的账号。这告诉我Spiderman有一个管理员帐户,因为他是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          |

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

您应该添加另一列。现在可以使用GROUP BY子句为每个account_id获取不同的记录,但所有非聚合列的结果都可以是ambigius。您必须在组内有一些您批准的订单或指示符,以确定每个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'
  )

答案 1 :(得分:-1)

试试这个

select * from table1
group by account_id

demo here

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

答案 2 :(得分:-1)

以下是您要求的解决方案,

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