我有一张这样的桌子
|num|id|name|prj|
| 1 | 1|abc | 1 |
| 2 | 1|efg | 1 |
| 3 | 1|cde | 1 |
| 4 | 2|zzz | 1 |
我要运行这样的查询:
SELECT * FROM table WHERE prj=1 ORDER BY name
,但只打印一次重复值。我想保留所有行,我想在数据库级别而不是在表示层上这样做(我知道如何在php中做到这一点。)
期望的结果是
|num|id|name|prj|
| 1 | 1|abc | 1 |
| 3 | |cde | 1 |
| 2 | |efg | 1 |
| 4 | 2|zzz | 1 |
关于从哪里开始构建该查询的任何提示?
答案 0 :(得分:2)
使用会话变量来测试先前的ID是否与当前的ID相同:
SELECT num, IF(@lastid = id, '', @lastid := id) AS id, name, prj
FROM table
CROSS JOIN (SELECT @lastid := null) x
ORDER BY table.id, name
请注意,您需要限定table.id
,因为ORDER BY
默认使用SELECT
列表中的别名(如果它与表列相同),并且将对空字段进行排序首先。