真的不想问这个因为我确定它很简单但是:
我有一个用户数据库,其中包括邮政编码(邮政编码)和出生日期的字段。
访问者可以按年龄和距离搜索自己的位置来搜索用户。要做到这一点,我必须选择所有用户,然后计算他们的年龄,然后计算他们的距离,如下所示:
$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
我希望这是有道理的。 谢谢
答案 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
与在数据库中选择相比,使用任何语言制作多个选择和循环数据的速度都很慢。