MYSQL根据组的默认值选择

时间:2013-10-01 14:04:55

标签: mysql sql mysqli

我有一个包含人名和国家代码的sql表。

----------------
 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%'; 的最后一行基。

当我尝试这个时

{{1}}

但是它给了我一些符合上述条件的行。 我希望如果条件失败然后给我该组的最后一行,是否可能? 如果可能的话,怎么样?

2 个答案:

答案 0 :(得分: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`

答案 1 :(得分:0)

您可以尝试此查询。它返回你需要的东西,但要注意 - 这个查询有两个陷阱:

  1. 子查询是10 ^ 6行的痛苦
  2. 外部查询中的字段名称是非聚合的。 MySQL文档说,不可能说为非聚合选择什么值。
  3. 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      |
    +---------+---------+