Php Mysql-获得所需值前后的6个结果,以制作比较图
今天,我面临着一个挑战,我可以用多个查询、一点PHP和一些其他有趣的事情来解决,但我想知道我想做的事情是否可以用一个查询和/或存储的fn/过程来实现 我更好地解释自己: 在一个城市列表中,我需要选择一个值,比如说那个命名城市的一般费用,比如说罗马 很简单 我想做的是: 在罗马记录之前和之后有6条相同值的记录。 所以我会看到:Php Mysql-获得所需值前后的6个结果,以制作比较图,php,mysql,sql,comparison,ranking,Php,Mysql,Sql,Comparison,Ranking,今天,我面临着一个挑战,我可以用多个查询、一点PHP和一些其他有趣的事情来解决,但我想知道我想做的事情是否可以用一个查询和/或存储的fn/过程来实现 我更好地解释自己: 在一个城市列表中,我需要选择一个值,比如说那个命名城市的一般费用,比如说罗马 很简单 我想做的是: 在罗马记录之前和之后有6条相同值的记录。 所以我会看到: | position | city | expenses | | 35 | Paris | 1364775 | | 36 | M
| position | city | expenses |
| 35 | Paris | 1364775 |
| 36 | Milan | 1378499 |
| 37 | New York | 1385759 |
| 38 | London | 1398594 |
| 39 | Oslo | 1404648 |
| 40 | Munchen | 1414857 |
| 41 | Rome | 1425773 | *** <--this is the value I need
| 42 | Dublin | 1437588 |
| 43 | Athen | 1447758 |
| 44 | Stockholm | 1458593 |
| 46 | Helsinki | 1467489 |
| 47 | Moscow | 1477484 |
| 48 | Kiev | 1485665 |
这些值将填充条形图
正如你所看到的,还有另一个复杂的层次:职位
必须在所有记录上计算位置
假设我有100条记录,我的排名从1到100,但只有有限的13条记录必须输出
有什么链接、建议、教程或其他可以帮助我的吗?
像往常一样提前谢谢你
编辑
必须计算位置。它不是一个输入值
无论如何,谢谢大家的努力
SELECT
all_ranked.*
FROM (select rank
from (SELECT a.id AS id2,
@curRow := @curRow + 1 AS Rank
FROM the_table a
JOIN
(SELECT @curRow := 0) r
ORDER BY position DESC
) AS B)
where B.id=1234567) as rank_record, <--- just one record - value of rank
(SELECT a.id AS id2,
@curRow := @curRow + 1 AS Rank
FROM the_table a
JOIN
(SELECT @curRow := 0) r
ORDER BY position DESC
) AS all_ranked <--- all ranked users
where all_ranked.rank>=rank_record.rank-6 and all_ranked.rank>=rank_record.rank+6
在一个查询中创建两个查询。第一个获取位置,第二个设置位置和剪切的所需片段。您可以使用一个存储函数/过程,该函数/过程接收指示主题记录的输入,例如Rome,以导出排名,我在这里将其称为该记录的感知ID PID,例如41。然后可以使用变量@PID来存储该位置 然后您可以再次进行排名查询,但选择所有记录
SELECT .... WHERE Ranking BETWEEN (@PID-6) AND (@PID+6)
这样做的一个优点是,函数/过程可以引入一个额外的参数,以允许它在排序之后获取X条记录,在排序之前获取Y条记录。它也更容易阅读和维护
在不使用PHP的情况下,将其作为单个查询执行会很棘手,因为您需要插入WHERE子句,其中条件是另一个查询的结果。如果您的位置是连续唯一的数字,则可以在WHERE条件中使用子查询
SELECT `position`, `city`, `expenses`
FROM table_name
WHERE `position` > (
SELECT `position`-7
FROM table_name
WHERE `city`='Rome'
)
ORDER BY `position`
LIMIT 13
PS:我不是SQL方面的专家。可能有更好更有效的方法。我还没有尝试过,但这应该是可行的:在MySQL中选择时,您可以使用一个递增的变量来获取位置。然后您必须选择这个临时表两次;一次找到罗马,一次找到所有13条记录:
select
from
(
select @rowno := @rowno + 1 as position, city, expenses
from cities
cross join (select @rowno := 0)
order by expenses
)
where abs(position -
(
select position, city
from
(
select @rowno := @rowno + 1 as position, city, expenses
from cities
cross join (select @rowno := 0)
order by expenses
)
where city = 'Rome'
)
) <= 6;
位置是否总是连续数字?必须计算位置。它不是输入值如何计算位置?谢谢mihai,但位置不是输入值。它必须经过计算。此外,我在你的小提琴中看不到罗马:@Aptivus改变了它,忽略了它在表中的位置。你的查询很酷,但在一堆171条记录上,+6/-6似乎不起作用。@Aptivus将它们添加到小提琴中,我看到它起作用了,有12条以上。谢谢你的酷形容词,这对我意义重大。这是一个包含真实数据的例子。表中没有可用的位置字段。我已经尝试过调整您的查询,但由于位置字段的原因,没有成功。a01字段是居民数量,a05是一种费用,a06是另一种费用。字段codice_alfanumerico_istat是城市识别码。必须在A05Stnislav上进行分析。我在您的查询中收到一个错误,指出每个派生表都必须有自己的别名。位置不是一个输入,而是一个计算值。谢谢Thorsten。这就是我得到的:“1064-您的SQL语法有一个错误;查看与MySQL服务器版本对应的手册,以了解可在第2行选择@rowno:=@rowno+1作为位置,codice_alfanumerico_istat'附近使用的正确语法,其中codice_alfanumerico_istat是城市的标识符
SELECT rank as position,city,expenses FROM
(SELECT @rownum := @rownum + 1 AS position, city, expenses, FIND_IN_SET( position, (
SELECT GROUP_CONCAT( position
ORDER BY position ASC )
FROM test )
) AS rank
FROM test,(SELECT @rownum := 0) r
HAVING rank BETWEEN(SELECT FIND_IN_SET( position, (
SELECT GROUP_CONCAT( position
ORDER BY position ASC )
FROM test )
)-6 AS rank
FROM test
WHERE expenses=1425773)
AND
(SELECT FIND_IN_SET( position, (
SELECT GROUP_CONCAT( position
ORDER BY position ASC )
FROM test )
)+6 AS rank
FROM test
WHERE expenses=1425773))x