0

嗨,我正在使用 PHP 和 mysql,我的数据库表为:

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 的范围内,如果价格与它们相同,我必须修剪它的最后一个值,如果不同的价格在 10 的范围内,那么我的代码将保持原样。

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

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

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

有没有最好的方法用 MySQL 查询来做到这一点。

谢谢

4

2 回答 2

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)

一个用于测试的 SQLfiddle

编辑:在您更新您的要求后,我认为这将适用于您的动态长度,只要国家代码长度不变(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)

另一个 SQLfiddle

于 2013-03-09T07:38:45.663 回答
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;
于 2013-03-09T07:09:26.990 回答