来自PHP的MySQL查询组合来自两个表的数据

时间:2014-04-12 20:43:02

标签: php mysql

我正在我的网页上使用关注系统,我需要向用户显示他们关注的用户的帖子。我在mysql中有一个名为follow的表,其中包含user1_iduser2_id。如果id为34的用户跟随id为45的用户,则将其存储在该表中。所以我需要的是选择有人关注的所有用户ID并从另一个表中查找他们的帖子。 我需要一些SELECT * FROM table1 WHERE u_id=[users id-s that they follow].的命令 我已经尝试过这样的事了:

$id = $_SESSION['user_id'];
$follow_query = mysql_query("SELECT user_two_id FROM follow WHERE user_one_id=$id");
while($follow_array = mysql_fetch_array($follow_query)){

$sql = mysql_query('SELECT home FROM `matches` WHERE `u_id` IN (' . implode(',',array_map('intval', $follow_array)) . ')');
$sql_array = mysql_fetch_array($sql);}

但它不起作用。

这是下表:

follow table

它显示用户33正在跟随用户34和用户35。

这是我需要显示的数据存储的表格:

other table

但我需要向用户显示他正在关注的用户的帖子,在这种情况下,来自ID为34和35的用户。

3 个答案:

答案 0 :(得分:0)

$id = $_SESSION['user_id'];
#select ID of users who are following a particular user
$follow_query = mysql_query("SELECT user_two_id FROM follow WHERE user_one_id='{$id}'");
#create an array in which we will contain "home" of users
$homes = array();
while($follower_id = mysql_fetch_array($follow_query)){
    $query = mysql_query("SELECT home FROM matches WHERE u_id='{$follower_id}'");
    while ($home = mysql_fetch_array($follow_query)){
        $homes[] = $home;
    }
}

的变化:

  • 传递给查询时,将{}放在PHP变量周围。
  • 关注第一位用户的用户的主页现在位于阵列家庭中。

答案 1 :(得分:0)

$ follow_array就像你命名的那样,是一个数组。您实际上想要访问$ follow_array ['user_two_id']

答案 2 :(得分:0)

您应该使用JOIN重新组合2个查询,以便将处理留给MySQL。

$id = $_SESSION['user_id'];
$offset = ($pn - 1) * $itemsPerPage;

$query = sprintf("SELECT home, u_id FROM matches m
    JOIN follow f ON m.u_id = f.user_two_id
    WHERE f.user_one_id = '%d'
    AND m.date > DATE_SUB(NOW(), INTERVAL 1 WEEK)
    ORDER BY m_id DESC
    LIMIT %d,%d", $id, $offset, $itemsPerPage);

$result = mysql_query($query);

if (!$result) {
    $message  = 'Invalid query : ' . mysql_error() . "\n";
    $message .= 'Whole query:  : ' . $query;
    die($message);
}

while ($row = mysql_fetch_assoc($result)) {
    echo $row['home'];
    echo $row['u_id'];
}

mysql_free_result($result);