基于先前精炼的MySQL查询从MySQL中选择

时间:2012-10-31 20:26:14

标签: php mysql

真的不想问这个因为我确定它很简单但是:

我有一个用户数据库,其中包括邮政编码(邮政编码)和出生日期的字段。

访问者可以按年龄和距离搜索自己的位置来搜索用户。要做到这一点,我必须选择所有用户,然后计算他们的年龄,然后计算他们的距离,如下所示:

$result = queryMysql("SELECT user FROM table WHERE user !='$user' ORDER BY joindate DESC ");
$num = mysql_num_rows($result);

for ($j = 0 ; $j < $num ; ++$j)
{
$row = mysql_fetch_row($result);
if ($row[0] == $user) continue;

$query = "SELECT * FROM table WHERE user='$row[0]'";
$res=mysql_query($query);
$users=mysql_fetch_assoc($res);

//Get Date of Birth and Calculate Age
$dob = $users['age'];
$age = ...

//Get Profile's Postcode and Calculate Distance 
$profilepc = $views['postcode'];
$distance = ...

if(($distance <200) AND ($age >18 AND <30)) {

}
到目前为止,没问题。然而,然后我想运行另一个查询(用于分页)只选择那些符合访问者设置的年龄和距离参数的用户,我可以在上面的IF语句中回显,但我不知道如何包含在新查询。

那么,我如何将第一个查询的结果放入某个东西(一个数组?),然后从第一个查询中使用user_id(它是唯一的)来仅为我的分页选择所需的用户?类似的东西:

SELECT * FROM $table WHERE user_id=(filtered user_id's) ORDER BY joindate DESC 

我希望这是有道理的。 谢谢

3 个答案:

答案 0 :(得分:5)

使用IN代替=

SELECT * FROM $table
WHERE user_id IN (select user_id from other_table where some_condition) 
ORDER BY joindate DESC 

答案 1 :(得分:1)

您可以将子查询用于IN子句,或者如果您已有PHP数组ID:

// assuming your array of IDs is
$user_ids = array(1, 2, 3, 4);

// use implode() to create a comma separated list for use in your IN clause
$query = "SELECT * FROM {$table}
WHERE user_id IN (" . implode(',', $user_ids) . ") 
ORDER BY joindate DESC;"

答案 2 :(得分:1)

如果您可以使用SQL做某事,那么它是最好和最快的选择。下面的查询将选择除年龄(年)超过30年的用户以外的所有用户。

我无法为距离编写SQL,因为我不知道您的数据,因此不知道如何计算它。但是我添加了一些可以添加的地方。

“limit”子句将在数据库中从10到20获取记录。

   SELECT 
       * 
    FROM 
       table
    WHERE 
       user != $user
       and (
           (year(now()) - year(table.birthday))  > 30
           or (some match to calculate distance)
        )
    limit 10, 20

如果您需要来自另一个表的更多数据,您可以像这样将它们连接在一起。

   SELECT 
       * 
    FROM 
       table
       another_table
    WHERE 
       another_table.user = table.user
       table.user != $user
       and (
           (year(now()) - year(table.birthday))  > 30
           or (some match to calculate distance)
        )
    limit 10, 20

与在数据库中选择相比,使用任何语言制作多个选择和循环数据的速度都很慢。