2013-03-09 29 views
0

你好我使用PHP和MySQL的其他列的值来在一个范围区间,我对数据库表:我的SQL查询来获取的值取决于表

Code Price 
226 0.001 
7565 0.001 
7566 0.001 
7567 0.001 
7568 0.001 
7569 0.001 
7570 0.001 
7571 0.001 
7572 0.001 
7583 0.002 
7584 0.002 
7585 0.003 
7586 0.003 

和我需要输出为:

Code Price 
226 0.001 
756 0.001 
757 0.001 
7583 0.002 
7584 0.002 
7585 0.003 
7586 0.003 

也就是说,如果在十年的范围内,如果价格来同他们,我必须削减它的最后一个值,如果不同的价格进来的10范围内,那么我的代码将是因为它是。

由于上面的226有一个单一的值,在220和229之间没有更多的值,所以我们把这个值作为226 - 0.001,并且从7565到7569这些数字在7560-7569的范围内并且具有相同的价格,所以我将使用这些分组并获得共同价值756,7583,7584,7585,7586这些在7580-7589范围内,但有两个价值的价值,所以我们不能使用组的全范围的代码,所以它将作为它的。只有在代码范围在十个之间且价格相同的情况下,我才需要修剪。

让我明确我的要求,我有国家名称,国家代码,城市代码和价格的数据库,我正在读取excel的值。在国家/地区字段中,只有一个值类似于225或2247或226,而在城市代码中会有对应于国家的值,如120,123-129,165-169可能是1- 5等。

Normaly我的要求是Concat的国家代码和相应的城市代码像如果城市代码列包含120,123-129,165-169那么值将225120,225123, 225124,225125,225126,225127,225128,225129,225165,225166,225167,225168,225169 所以这是我的原创数据库场景。但是如果国家代码是225并且城市代码是空白的并且226是另一个国家代码并且城市代码是空白的,那么城市代码对于正确的国家代码将是空白的。因此,即使价格相同,适当的国家或地区代码值也不会被视为225,226。只有在城市代码拼接的情况下,这些值才会被修剪。

是否有任何最好的方式来做到这一点与MySQL查询。

谢谢

+0

我认为我不明白... – Class 2013-03-09 07:03:32

+0

类似上面226有一个单一的值没有更多的价值在220和229之间,所以我们取这个值为226 - 0.001,从7565到7569这些数字是在7560范围内-7569和具有相同的价格,所以我将使用这些组合并获得共同价值756和7583,7584,7585,7586这些是在7580-7589范围内,但有两个价值的价值,所以我们不能使用组的完整代码范围,所以它将作为它的。只有在代码范围在十个之间且价格相同的情况下,我才需要修剪。 – Dinesh 2013-03-09 07:07:18

回答

0

我想我明白你在做什么。以下是非常低效的查询,旨在指导您如何在查询中执行此操作。如果它像你愿意,你可以优化它:

select distinct code, price 
from (
    select case when pricecount>1 then code else code10 end as code, 
    price 
    from test 
    join (
     select code10, count(distinct(price)) as pricecount 
     from (
      select floor(code/10) as code10, price 
      from test 
     ) a group by code10 
    ) b 
    on floor(test.code/10)=b.code10 
) c; 
1

我不认为这是写在索引中友好的方式这个查询的方式,所以如果它运行一切的时候,你可能要重组而不是你的数据。

该查询将代码缩减为3个字符,我假设这是正确的,因为没有缩短226。

SELECT SUBSTR(Code,1,3) Code, Price FROM Test 
GROUP BY SUBSTR(Code,1,3) HAVING COUNT(DISTINCT Price) = 1 
UNION 
SELECT Code, Price FROM Test WHERE SUBSTR(Code, 1, 3) IN 
    (SELECT SUBSTR(Code,1,3) Code FROM Test 
    GROUP BY SUBSTR(Code,1,3) HAVING COUNT(DISTINCT Price) > 1) 

An SQLfiddle to test with

编辑:当您更新您的要求后,我认为这将与您的动态长度一起工作,只要国家代码长度不变(3);

SELECT SUBSTR(Code,1,GREATEST(3,LENGTH(Code)-1)) Code, Price FROM Test 
GROUP BY SUBSTR(Code,1,GREATEST(3,LENGTH(Code)-1)) 
    HAVING COUNT(DISTINCT Price) = 1 
UNION 
SELECT Code, Price FROM Test 
WHERE SUBSTR(Code, 1, GREATEST(3,LENGTH(Code)-1)) IN 
    (SELECT SUBSTR(Code,1,GREATEST(3,LENGTH(Code)-1)) Code FROM Test 
    GROUP BY SUBSTR(Code,1,GREATEST(3,LENGTH(Code)-1)) 
    HAVING COUNT(DISTINCT Price) > 1) 

Another SQLfiddle

+0

嗨joachim感谢您的回答,并且它的工作正常,并且它将代码缩减为3个字符,正如您已经解释的那样。但有什么办法可以使它动态.....如果也有像225345-225349 – Dinesh 2013-03-09 08:28:47

+0

@Dinesh这样的值是的,但是在这种情况下,您需要阐明规则用于减小尺寸的规则。例如,为什么不减少到2个字符? – 2013-03-09 08:45:22

+0

感谢您的回复我已经编辑了明确要求的问题谢谢 – Dinesh 2013-03-09 09:12:26