选择*匹配mysql表中的用户邮政编码?

时间:2013-03-11 12:16:10

标签: php mysql

我正在尝试显示本地居住的用户列表给登录的用户。因此,如果登录的会话用户的邮政编码为“m3 4”,则其他5位用户的邮政编码以“m3”开头4'然后这些用户将被显示给用户。

我的桌子布局如下:

id  |   user_id  | user_postcode
1          2          M3 4
2          3          SM2 7
3          4          M3 4

因此,在这种情况下,用户2将显示给登录的用户4,因为他们的邮政编码匹配。

我正在尝试在mysql中执行此操作,当我手动将邮政编码放入其中时,它会起作用:

AND ptb_stats.user_postcode='M3 4'

但我正在尝试使其特定于用户会话,因此如果登录的用户/ $ _SESSION [user_id']与其他用户具有相同的邮政编码。

我试图这样做,但它显示所有没有邮政编码的用户,因为它应该显示具有匹配邮政编码的用户,不应该吗?

function get_local_users() {
            global $connection;
            global $_SESSION;
            $query = "
            SELECT *
            From ptb_stats, ptb_users
            WHERE ptb_stats.user_id=ptb_users.id
            AND ptb_stats.user_postcode='".$_SESSION['user_postcode']."'";
            $local_set = mysql_query($query, $connection);
            confirm_query($local_set);
            return $local_set;
        }

3 个答案:

答案 0 :(得分:0)

如果用户ID存储在$_SESSION['user_id']中,您可以通过

获取本地用户
select u.id, u.name
from ptb_users u
join ptb_stats s1 on s1.user_id = $_SESSION['user_id']
join ptb_stats s2 on s2.user_id = u.id and s2.user_postcode = s1.user_postcode
where u.id <> $_SESSION['user_id']

SQLFiddle

如果您在$_SESSION['user_postcode']中有邮政编码,则更容易

select u.id, u.name
from ptb_users u
join ptb_stats s on s.user_id = u.id
     and s.user_postcode = $_SESSION['user_postcode']
where u.id <> $_SESSION['user_id']

SQLFiddle

答案 1 :(得分:0)

通过这个答案,我假设$ _SESSION ['user_postcode']是从某种类型的输入框中填充的,值是一个有效的zipCode(如“M3 4”)。

您可以使用preg_match从数字中拆分zipcode,并尝试从数据库中选择zipcodes。看一下这个例子:

$matches = array();
$zipCode = preg_match('/^([a-z0-9]+)/i', $_SESSION['user_postcode'], $matches); 

邮政编码现在位于第二位的$ matches变量中($ matches [1])。 现在使用此值创建查询并检查它是否与其他查询相同..

$query = "SELECT *
        From ptb_stats, ptb_users
        WHERE ptb_stats.user_id=ptb_users.id
        AND ptb_stats.user_postcode REGEX '^" . $matches[1] . "'";

答案 2 :(得分:0)

根据你描述的内容,我会继续这样做。

我使用PDO的预处理语句来处理查询。

function get_local_users() {
    // given that it was created like this: $connection = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8', 'username', 'password');
    global $connection;

    $stmt = $connection->prepare(
        "SELECT ptb_stats.*
        FROM ptb_stats, ptb_users
        WHERE ptb_stats.user_id = ptb_users.id
        AND ptb_stats.user_id != ?
        AND ptb_stats.user_postcode = (
            SELECT user_postcode 
            FROM ptb_stats 
            WHERE user_id = ?
        )");

    $stmt->execute(array($_SESSION['user_id'], $_SESSION['user_id']));
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

    return $rows;
}