2015-10-30 63 views
0

我具有存儲值的表格:(實際上從I18N Drupal的模塊)MYSQL:有條件地在兩個字段上排序?

nid | tnid 
1 | 1 
2 | 1 
3 | 1 

這實際上意味着,節點1,2和3,是源節點,該節點是NID = 1。因此所有的衍生物1 = tnid。

的問題是,你也可以得到與語言無關的節點:

nid | tnid 
4 | 0 
5 | 0 
6 | 0 

我需要什麼,是一個查詢得到這個:由tnid

nid | tnid 
1 | 1 
4 | 0 
5 | 0 
6 | 0 
換句話說,組

,除了在它的情況是0.什麼是MySQL查詢這是什麼?

+0

你能擴展你的例子和輸出嗎? NID 2和3會發生什麼? –

回答

2
SELECT * 
FROM myTable 
WHERE tnid = nid 
    OR tnid = 0 
+0

我是個笨蛋。謝謝。 *捂臉* – coderama

0

可以這樣做。查詢相當乾淨映射到用於請求它的話:「通過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
  • 我認爲nittnid都不能爲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)