Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.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 Mysql-获得所需值前后的6个结果,以制作比较图_Php_Mysql_Sql_Comparison_Ranking - Fatal编程技术网

Php Mysql-获得所需值前后的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

今天,我面临着一个挑战,我可以用多个查询、一点PHP和一些其他有趣的事情来解决,但我想知道我想做的事情是否可以用一个查询和/或存储的fn/过程来实现

我更好地解释自己: 在一个城市列表中,我需要选择一个值,比如说那个命名城市的一般费用,比如说罗马

很简单

我想做的是: 在罗马记录之前和之后有6条相同值的记录。 所以我会看到:

| 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