我在 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中的第一个