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

时间:2016-02-23 09:15:06

标签: 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
案件可以是

案例1

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

Desired result = 9 

case2

     Product Tier1 Tier2 Tier3   value
         A       ANZ    DE    Outlet  9

   Desired result = 9

case3

    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 

case5

 case4
   Product Tier1 Tier2 Tier3   value
     A       ANZ    -     -       2

 Desired result = 2

5 个答案:

答案 0 :(得分:0)

我认为以下内容应该符合您的要求:

SELECT value
FROM product
WHERE product.Product = 'A'
ORDER BY Tier1 DESC, Tier2 DESC, Tier3 DESC
LIMIT 1

...当然,使用您实际需要的任何产品代替'A'

答案 1 :(得分:0)

我猜你应该像这样使用子查询

select * from table where product=(select Product B) and product=(select product A)

这是所有查询

  select * from table where product=('SELECT value FROM product WHERE product.Product = 'A' ORDER BY id_product  DESC LIMIT 1')  and product=('SELECT value FROM product WHERE product.Product = 'b' ORDER BY id_product DESC  LIMIT 1')

未经测试但您可以使用loggic,希望此帮助

编辑:我使用编辑id_product(认为它是自动增量ya)所以你可以得到这是正确的数据

答案 2 :(得分:0)

试试这个:

SELECT Product, Tier1, Tier2, Tier3
FROM (
  SELECT Product, Tier1, Tier2, Tier3,
         @rn := IF(@p = Product, @rn + 1,
                   IF(@p := Product, 1, 1)) AS rn
  FROM mytable
  CROSS JOIN (SELECT @rn := 0, @p = '') AS vars
  ORDER BY 
     Product, 
     IF(Tier3 = '-', 1, 0),
     IF(Tier2 = '-', 1, 0),
     IF(Tier1 = '-', 1, 0)) AS t
WHERE t.rn = 1     

ORDER BY使用条件,以便根据与记录相关的最高级别对记录进行排序。

使用此顺序,查询使用变量确定每组最大记录。对于每个@rn切片中的第一条记录,Product为1。产品更改后,@rn将重置为1,以开始计算下一个切片。

注意:如果Tierx = '-'用于指定空级别而不是Tierx IS NULL,则可以将条件NULL更改为'-'

Demo here

答案 3 :(得分:0)

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

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)

答案 4 :(得分:0)

尝试;

select y.Product, y.value
from (
    select 
        Product, 
        max(case 
            when Tier3  is not null then 3 
            when Tier2  is not null then 2 
            when Tier1  is not null then 1
        else 0  end) max_Tier
    from tbl
    group by Product
) x
join (
    select 
        Product, 
        case 
            when Tier3  is not null then 3 
            when Tier2  is not null then 2 
            when Tier1  is not null then 1
        else 0  end Tier,
        value
    from tbl
) y
on x.Product = y.Product
and y.Tier = x.max_Tier