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
答案 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
更改为'-'
。
答案 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