可以這樣做。查詢相當乾淨映射到用於請求它的話:「通過tnid 組,除了它是0的情況下,」
您可以使用一個普通的老GROUP BY tnid
GROUP BY,相反,你GROUP BY調用「if」函數的值。如果tnid爲0,則生成的值將是唯一的(因此不會與任何組合在一起)。否則,只需返回非零tnid。
select
min(nit),
if(tnid=0,concat('special',nit), tnid)
from some_table
group by
if(tnid=0,concat('special',nit), tnid);
一旦你看到爲什麼上述工作,那麼下面可能更像是原來的請求後得到什麼。這也適用於:
select
min(nit),
tnid
from some_table
group by
if(tnid=0,concat('special',nit), tnid);
假設警告:
- 我認爲
nit
就像是一個主鍵列,每一行都有一個唯一的nit
。
- 我認爲
nit
和tnid
都不能爲NULL。
如果這些假設中的任何一個都是無效的,那麼查詢可能需要一些調整,但是「通過一些表達式組」(不是裸列)的一般想法仍然成立。
注:
- 爲串聯「特殊」與
nit
的理由如下:你需要一些獨特的東西(因此,nit
),以防止分組在一起的tnid=0
行。但是您還需要對數值進行變形(因此,「特殊」),以使其不會與tnid
不爲零的行中的任何實際tnid
值一致。
,我和是如下測試的完整的例子。
我在安裝了Homebrew的mac osx10.8(x86_64)上使用MySQL 5.6.26。
mysql> create table some_table(nit int not null, tnid int not null);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into some_table values (1, 1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into some_table values (2, 1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into some_table values (3, 1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into some_table values (4, 0);
Query OK, 1 row affected (0.00 sec)
mysql> insert into some_table values (5, 0);
Query OK, 1 row affected (0.00 sec)
mysql> insert into some_table values (6, 0);
Query OK, 1 row affected (0.00 sec)
mysql> select
-> min(nit),
-> if(tnid=0,concat('special',nit), tnid)
-> from some_table
-> group by
-> if(tnid=0,concat('special',nit), tnid);
+----------+----------------------------------------+
| min(nit) | if(tnid=0,concat('special',nit), tnid) |
+----------+----------------------------------------+
| 1 | 1 |
| 4 | special4 |
| 5 | special5 |
| 6 | special6 |
+----------+----------------------------------------+
4 rows in set (0.00 sec)
你能擴展你的例子和輸出嗎? NID 2和3會發生什麼? –