mysql - 检索为 Mysql 中的树数据定义的最后一个值

标签 mysql sql

Product Tier1 Tier2 Tier3   value
 A       ANZ    -     -       2
 A       ANZ    DE    -       3
 A       ANZ    DE    Outlet  9
 B       EMEA   -     -       4
 B       EMEA   IT    -       6

我每次都对为产品定义的最后一个值感兴趣。 例如,对于产品 A,我应该得到值 9,对于产品 B,我应该得到值 6。

我是否可以直接使用 sql 查询获取结果,或者我加载整个产品行并在后端代码中执行操作以获得最终值。什么更可取。我正在使用 MYsql。

  ANZ       2        
   |
   DE       3
   |
   OUTLET - 9 last defined level value is 9


 EMEA   4
  |
 IT     6
  |
  ?     No value defined so last defined level value is 6

情况可以

案例一

 Product Tier1 Tier2 Tier3   value
     A       ANZ    -     -       2
     A       ANZ    DE    -       3
     A       ANZ    DE    Outlet  9

Desired result = 9 

案例2

     Product Tier1 Tier2 Tier3   value
         A       ANZ    DE    Outlet  9

   Desired result = 9

案例3

    Product Tier1 Tier2 Tier3   value
         A       ANZ    -     -       2
         A       ANZ    DE    Outlet  9

   Desired result = 9

案例4

 Product Tier1 Tier2 Tier3   value
     A       ANZ    -     -       2
     A       ANZ    DE    -       3

   Desired result = 3 

案例5

 case4
   Product Tier1 Tier2 Tier3   value
     A       ANZ    -     -       2

 Desired result = 2

最佳答案

这是一个经过验证的解决方案,已提供数据。

SQL:

SELECT
    product,
    tier1,
    tier2,
    tier3,
    value
FROM 
    tbl tbl2
WHERE
    ( tbl2.product, ((tier1 IS NOT NULL) + (tier2 IS NOT NULL ) + (tier3 IS NOT NULL)) ) IN
        (
            SELECT 
                product,
                MAX( (tier1 IS NOT NULL) + (tier2 IS NOT NULL ) + (tier3 IS NOT NULL) ) maxTierCnt
            FROM
                tbl
            WHERE
                tbl.product = tbl2.product
        );

输出:

mysql> SELECT * FROM tbl;
+---------+-------+-------+--------+-------+
| product | tier1 | tier2 | tier3  | value |
+---------+-------+-------+--------+-------+
| A       | ANZ   | NULL  | NULL   |     2 |
| A       | ANZ   | DE    | NULL   |     3 |
| A       | ANZ   | DE    | Outlet |     9 |
| B       | EMEA  | NULL  | NULL   |     4 |
| B       | EMEA  | IT    | NULL   |     6 |
+---------+-------+-------+--------+-------+
5 rows in set (0.00 sec)

mysql>
mysql> SELECT
    ->     product,
    ->     tier1,
    ->     tier2,
    ->     tier3,
    ->     value
    -> FROM
    ->     tbl tbl2
    -> WHERE
    ->     ( tbl2.product, ((tier1 IS NOT NULL) + (tier2 IS NOT NULL ) + (tier3 IS NOT NULL)) ) IN
    ->         (
    ->             SELECT
    ->                 product,
    ->                 MAX( (tier1 IS NOT NULL) + (tier2 IS NOT NULL ) + (tier3 IS NOT NULL) ) maxTierCnt
    ->             FROM
    ->                 tbl
    ->             WHERE
    ->                 tbl.product = tbl2.product
    ->         );
+---------+-------+-------+--------+-------+
| product | tier1 | tier2 | tier3  | value |
+---------+-------+-------+--------+-------+
| A       | ANZ   | DE    | Outlet |     9 |
| B       | EMEA  | IT    | NULL   |     6 |
+---------+-------+-------+--------+-------+
2 rows in set (0.00 sec)

关于mysql - 检索为 Mysql 中的树数据定义的最后一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35573314/

相关文章:

mysql - 如何查找具有所有其他列值的所有行

sql - PostgreSQL 不会使用主键进行内部连接

mysql - MySQL 中使用 LIMIT 左连接子选择

mysql - 我应该为每个用户(有数百万用户)存储 90 行数据吗?

php - 选择表 A 中的所有元素,按表 B 中链接到每个项目的条目数排序

mysql - 替换数字之间的字符

mysql - SQL - 将多对多桥接表转换为一对一表

php - $this->query() 中条件为空的 Codeigniter

mysql - 加入长文本字段

mysql - 如何使用 Servlet 和 AJAX 下载 MySQL 的 BLOB?