我不确定我是否有这个权利,但我可以帮助我指出正确的方向。
基本上我有一个名为ptb_stats
的表。这张桌子的布局如下:
user_id | user_postcode
1 m3 4
2 m3 4
3 kt1 3
4 sm2 7
我正在尝试生成一个mysql查询,该查询将调出所有具有匹配邮政编码的用户。
例如,如果登录user 1 / user_id 1
,那么他们将看到user 2
与他们具有相同的邮政编码(以m3开头)
这大致告诉用户用户1和用户2彼此相距不到5英里。
我有一个有效的查询:
function get_local_users() {
global $connection;
$query = "
SELECT *
From ptb_stats, ptb_users
WHERE ptb_stats.user_id=ptb_users.id
AND ptb_stats.user_postcode='m3 4'
AND ptb_users.id!=".$_SESSION['user_id']."";
$local_set = mysql_query($query, $connection);
confirm_query($local_set);
return $local_set;
}
此刻我必须手动输入邮政编码到查询中才能正常工作。我的问题是我需要分配一个会话变量,我相信这将告诉查询将用户与具有相同邮政编码的用户匹配到登录的用户。
目前我已将$ _SESSION ['user_id']设置为变量,但有人先前已设置此变量,我正在尝试修复他们的所有工作,但无法与执行此操作的人取得联系。所以我不理解会话变量。我以为我可以将$ _SESSION ['user_id']更改为$ _SESSION ['user_postcode']并且它会起作用,但基本上我需要做的是如何让查询说:
如果登录用户的user_postcode
是(任何值),并且他们是匹配user_postcodes
的其他用户,则显示这些用户。
有人可以告诉我我需要做些什么才能让它发挥作用。我真的很感激。谢谢。
答案 0 :(得分:0)
SELECT a.*
FROM
tableName a
INNER JOIN
(
SELECT user_postcode
FROM tableName
GROUP BY user_postcode
HAVING COUNT(*) > 1
) b ON a.user_postcode = b.user_postcode
更新1
function get_local_users()
{
global $connection;
$query = " SELECT a.*
FROM ptb_stats a
INNER JOIN
(
SELECT user_postcode
FROM ptb_stats
GROUP BY user_postcode
HAVING COUNT(DISTINCT user_id ) > 1
) b ON a.user_postcode = b.user_postcode
WHERE a.user_id <> " . $_SESSION['user_id'];
$local_set = mysql_query($query, $connection);
confirm_query($local_set);
return $local_set;
}
作为旁注,如果变量的值( s )来自外部,则查询易受SQL Injection
攻击。请查看下面的文章,了解如何防止它。通过使用PreparedStatements
,您可以摆脱在值周围使用单引号。