0

我不确定我是否做对了,但我可以帮助我指出正确的方向。

基本上我有一张桌子叫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 4 开头)

例如,这大致告诉用户,用户 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则显示这些。

有人可以告诉我我需要做什么才能让它工作。我真的很感激。谢谢你。

4

1 回答 1

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; 
}

作为旁注,SQL Injection如果变量的值(s)来自外部,则查询很容易受到攻击。请看下面的文章,了解如何预防。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

于 2013-03-12T14:15:20.487 回答