Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我的SQL查询,以根据表中其他列的值获取范围间隔内的值_Php_Mysql - Fatal编程技术网

Php 我的SQL查询,以根据表中其他列的值获取范围间隔内的值

Php 我的SQL查询,以根据表中其他列的值获取范围间隔内的值,php,mysql,Php,Mysql,您好,我使用的是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

您好,我使用的是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,对于7583758475857586,它们的范围是7580-7589,但有两个价格值,所以我们不能将组用于整个代码范围,所以它将作为它的一部分。我需要修剪只有当代码之间的10个范围,并有相同的价格

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

通常情况下,我的要求是包含国家代码和相应的城市代码,如225如果城市代码列包含120123-129、165-169,则值应22512025123251225124225252251262512722512812951652251622516225167225169 这就是我最初的数据库场景。但如果国家代码是225,城市代码是空的,226是另一个国家代码,城市代码是空的,还有一件事,因为城市代码对于正确的国家代码是空的。因此,正确的国家代码值不会被调整,即使它们的价格相同,也会被视为225226。仅当城市代码为concated时,才会对值进行修剪

使用MySQL查询有什么最好的方法可以做到这一点吗


谢谢

我想我理解你的意图。下面是一个非常低效的查询,旨在帮助您了解如何在查询中执行此操作。如果它工作正常,您可以对其进行优化:

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;

我认为没有一种方法可以以索引友好的方式编写此查询,因此,如果它一直运行,您可能需要重新构造数据

查询将代码减少到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)

编辑:在您更新您的要求后,我认为这将适用于您的动态长度,只要国家代码的长度不变(3)


.

我想我不明白……像上面226这样的类只有一个值,在220和229之间没有更多的值,所以我们把这个值取为226-0.001,从7565到7569,这些数字的范围是7560-7569,价格相同,所以我将对这些数字使用分组,得到公共值756,对于7583758475857586,它们的范围是7580-7589,但有两个价格值,所以我们不能将组用于整个代码范围,所以它将作为它的一部分。我需要修剪,只有当代码的范围在10之间,并有相同的价格。嗨joachim谢谢你的回答和它的工作很好,它削减了代码到3个字符,因为你已经解释过。但有没有办法让它充满活力。。。。。如果还有像225345这样的值-225349@Dinesh是的,但是在这种情况下,你需要澄清什么是减少尺寸的规则。例如,为什么不把226缩减为2个字符?谢谢你的回答,我对问题进行了编辑,要求很明确Thanks@Dinesh更新了我认为您所要求的答案。是否有任何方法可以使用动态国家代码,如225、2247或226,正如我在要求中所给出的,以及我向您解释的初始国家代码数据库结构如国家/地区代码、城市/地区代码、完整代码、完整代码将具有值,我们将在将值逐个与城市代码组合后获得这些值,一行将具有单个值,而其他行将重复国家/地区代码的值
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)