-2

我在 PHP 中使用 SQL 查询来显示“用户”表中的 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          |

我怎样才能做到这一点?

4

3 回答 3

1

您可能应该添加另一列。现在可以为每个 account_id usingGROUP BY子句获取不同的记录,但所有非聚合列的结果可能是模糊的。您必须有一些您批准的订单或在组内指示以确定每个 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'
  )
于 2013-09-13T10:23:29.333 回答
-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
于 2013-09-13T10:50:29.250 回答
-1

尝试这个

select * from table1
group by account_id

演示在这里

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

于 2013-09-13T10:05:11.100 回答