我在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 |
我怎样才能做到这一点?
答案 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)
答案 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;
ACCOUNT_ID FULL_NAME SUPERHERO
1 Batman 1
2 Spiderman 1
3 Professor X 1
4 Cyclops 1