2013-10-01 62 views
0

基於一些默認值我有一個SQL表,包含人名和各自的國家代碼的名稱。MYSQL選擇基於一些默認值爲組

---------------- 
name | code 
---------------- 
saket | IN 

rohan | US 

samules | AR 

Geeth | CH 

Vikash | IN 

Rahul | IN 

Ganesh | US 

Zorro | US 

我想那是什麼,我應該能夠通過國家得到行組code其名先用sa開始,如果沒有集團的再Vi即使不那麼最後一行。

當我想這

SELECT * FROM MyTable GROUP BY code HAVING name like 'sa%' or name like 'vi%'; 

但它給我誰在having子句中的上述條件匹配的行。 我希望如果條件失敗,那麼給我該組的最後一行,是否有可能?如果可能,那麼如何?

回答

0

也許不是很有效,但嘗試:

SELECT FIRST(`name`) AS `name`, `code` FROM (
    SELECT `name`, `code` FROM `MyTable` 
     WHERE `name` LIKE 'sa%' 
    UNION ALL 
    SELECT `name`, `code` FROM `MyTable` 
     WHERE `name` LIKE 'vi%' 
    UNION ALL 
    SELECT LAST(`name`) AS `name`, `code` FROM `MyTable` GROUP BY `code` 
     HAVING `name` NOT LIKE 'sa%' AND `name` NOT LIKE `vi%' 
) AS `a` GROUP BY `code` 
0

你可以試試這個查詢。它返回你所需要的,但要注意 - 此查詢有兩個缺陷:

  1. 子查詢在外部查詢10^6行
  2. 字段名稱疼痛非聚集。 MySQL的文檔說,這是不可能說什麼價值將被選爲nonaggregated。

http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html

select name, country 
from 
    (
    select *, if(name like 'sa%', 0, if(name like 'vi%', 2, 3)) as name_order 
    from tmp_names 
    order by country, name_order, name desc 
) as tmp_names 
group by country 
order by name; 

如果手冊上說,該值將是不確定的,它返回

+---------+---------+ 
| name | country | 
+---------+---------+ 
| Geeth | CH  | 
| saket | IN  | 
| samules | AR  | 
| Zorro | US  | 
+---------+---------+ 
+0

,* *爲什麼你建議的功能? –

+0

任何時候我都做了類似的選擇,MySQL返回第一個值。也許這是運氣...無論如何,這可以幫助如果這個選擇需要一次。 – Nicolai

+0

我相信這是公平的,指出這是你自己的觀察,因爲這種行爲沒有記錄=它可能會在未來的版本中改變。 –