Php 我的SQL查询,以根据表中其他列的值获取范围间隔内的值
您好,我使用的是PHP和mysql,数据库表如下: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
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)