【问题标题】:Custom MySQL Order By depending on a PHP function value自定义 MySQL Order By 取决于 PHP 函数值
【发布时间】:2014-12-29 04:22:37
【问题描述】:

我有一个这样的数据库

http://i.stack.imgur.com/MHEwr.jpg

我有一个 PHP 函数,它将计算该地址与用户(网络用户)的距离 { get_distance ($person_location) }。

我需要有一个查询,它将使用该函数并按与用户的距离顺序从数据库中返回数据[使用 PHP 的 { get_distance ($person_location) } 函数]。

谁能帮帮我?

【问题讨论】:

  • 我从 PHP API 获取用户当前位置,从 DB 获取产品地址,从 PHP API 获取位置并使用 PHP 计算它们之间的距离。我正在按那个距离排序。是否可以在 MySQL 中对其进行排序?

标签: php mysql sql web laravel-4


【解决方案1】:

您不能在服务器端根据 PHP 函数的结果对 SQL 结果进行排序。*

有两种方法可以解决您的一般问题:

1. 将计算移至 SQL

您的距离计算可能依赖于地理坐标(纬度和经度)。为数据库中的每个地址保存这些数据,然后在 SQL 中进行距离计算。

在此处了解有关如何在 MySQL 中执行此操作的更多信息:Fastest Way to Find Distance Between Two Lat/Long Points

您的待办事项列表。执行以下操作一次:

  • 从数据库中获取所有地址
  • 使用您的 PHP API 计算每个地址的地理坐标
  • 更新您的数据库并将这些地理坐标放在额外的列中

从现在开始做以下事情:

  • 每次向表中添加一行时,请预先使用 API 计算地理坐标并添加它们
  • 每次更改数据库中的地址时,使用 PHP API 计算新的地理坐标并同时更新它们
  • 每次您需要计算当前用户到所有其他地址的距离时,请执行 SELECT 查询,计算距离并进行排序

2. 用 PHP 做所有事情

查询您的数据库中的所有地址,将它们放入 PHP 数组中,使用您的函数计算与当前用户的距离,然后对您的数组进行排序。

我强烈建议不要这样做,而是在服务器端实现所有内容(方法 1)。

* 理论上你可以,通过离线计算每个地址的距离,用结果更新一个临时表,然后使用这个临时表再次查询你的表来对你的结果进行排序。但是,这比在 PHP 中做任何事情还要糟糕,你甚至不应该考虑这个!

【讨论】:

  • 我从 PHP API 获取地理坐标。因此,将计算移至 SQL - 对我来说是一个糟糕的选择。有没有其他解决办法?
  • 更新您的数据库并为每个地址添加地理坐标。这是一次性的努力。只要确保将来在数据库中添加新行或更改地址以更新相应的地理坐标即可。一旦您的地理坐标在数据库中,使用当前用户的地理坐标通过 SQL 查找距离。请参阅我的答案中的链接以了解如何执行此操作。
  • 而且由于您在另一条评论中明确说明了 FB、google 等:他们都在各自的数据库端进行...这是最有效的方式。
  • 这取决于用户当前的位置。所以,如果我为它使用 DB,它不会满足我的目标......
  • 每当用户改变他们的位置,你必须再次查询数据库。距离是在SELECT 语句中从数据库中检索时计算的。所以你总是在计算当前距离!使用数据库来做这件事你完全没问题。
【解决方案2】:

恕我直言,不能在查询中使用 PHP 函数,只能使用 MySQL 提供的聚合函数。 我猜你需要通过 PHP 处理数据。

【讨论】:

  • 感谢您的友好回答。但是如果我在 PHP 中操作成千上万的数据,这个过程会很慢。因此,在 PHP 中必须有一种更快的方法来做到这一点。因为它在 FB、google 和许多其他网站上被广泛使用。所以,必须有另一种方式。谁能帮帮我?
猜你喜欢
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2015-08-25
  • 2011-05-04
相关资源
最近更新 更多