Php 3个不同表上的内部联接

Php 3个不同表上的内部联接,php,sql,join,Php,Sql,Join,我需要从3个不同的表中提取数据。我们需要做的是从posts表中提取posts,在posts表中,发布post的用户被设置为公共用户,或者如果设置为私有用户,则他们授予访问权限的用户可以查看他们的post 以下是表格: user: id, username, name, password, email, private posts: id, title, user, date, state privateallowed: id, privateuser, alloweduser 这是我试图获取记

我需要从3个不同的表中提取数据。我们需要做的是从posts表中提取posts,在posts表中,发布post的用户被设置为公共用户,或者如果设置为私有用户,则他们授予访问权限的用户可以查看他们的post

以下是表格:

user: id, username, name, password, email, private
posts: id, title, user, date, state
privateallowed: id, privateuser, alloweduser
这是我试图获取记录的代码:

$username = $_COOKIE['username'];
$sqlposts = "select p.id, u.id, u.private, a.privateuser, a.alloweduser from user u 
                inner join posts p on u.id = p.user 
                    inner join privateallowed a on a.privateuser = u.id and a.alloweduser = " . $username . " 
                        where u.private='public' or (a.privateuser=p.user and a.alloweduser=" . $username . ")";
$resultpost = mysqli_query($dbcon, $sqlposts);
$numrows = mysqli_num_rows($resultpost);
不幸的是,没有返回任何记录。非常感谢您的帮助和想法。

感谢您的帮助和想法(@pgngp评论说,
“$username.”周围需要单引号。
):


另外请注意,我已经从您的
WHERE
条件中删除了以下内容,因为它是由于以前的
内部联接而冗余的。我们只能推断出这一点,因为您使用了
内部联接
,如果您使用了
左联接
,则需要保持条件不变

. . .or (a.privateuser=p.user and a.alloweduser=" . $username . ")"
说明:

  • 内部连接posts p ON u.id=p.user
    • 因此我们确定
      u.id=p.user
  • a.privateuser=u.id上允许的内部连接privateA
    • 因此我们推断
      a.privateuser=p.user
  • 和a.alloweduser='“$username.”
    • 这涵盖了
      中的剩余条件,其中

    • 我确实找到了答案,尽管我确信这不是一个完美的答案。我所做的是将语句分解为单独的select语句,然后将其中一个语句嵌入where子句,如下所示:

       $sqlposts = "SELECT p.id, u.id, u.private 
              FROM user u 
              INNER JOIN posts p ON u.id = p.user 
              WHERE u.private='public' or p.user in 
              (
                  select a.privateuser 
                  from privateallowed a 
                  inner join posts p on p.user = a.privateuser 
                  where a.alloweduser=" . $username . "
              )";
      
      我和另一位对sql非常精通的人花了几个小时研究这个问题,但我们无法让select返回正确的结果。我们尝试了以下操作,但由于某些原因,它返回了每个公共用户3次:

      SELECT p.id, u.id, u.private 
              FROM user u 
              INNER JOIN posts p ON u.id = p.user 
              INNER JOIN privateallowed a on a.alloweduser=24
              WHERE u.private='public' or p.user = a.privateuser
      

      我感谢大家在这方面的帮助。如果有人有其他想法,我很感激。我正在一个网站上工作,我希望这个网站能够发展壮大,我想确保页面加载速度尽可能快。

      有没有哪怕是最简单的查询也能返回的记录?例如
      SELECT*FROM User
      ?是的,如果我只是从任何一个表中进行简单的选择,它就可以正常工作。我相信问题在于连接的语法,只是不确定在哪里“
因为您已经在
u.id=p.user
上为表
posts
执行
内部联接。因此,如果
a.privateuser=u.id
那么
a.privateuser=p.user
感谢您的回复。在php中,点和变量之间的空白并不重要。我将在早上尝试一下,并让您知道这是否有效。字符串值需要用引号括起来,因此不要使用
a.alloweduser=“.username.”
,而是尝试使用
a.alloweduser='.$username.
SELECT p.id, u.id, u.private 
        FROM user u 
        INNER JOIN posts p ON u.id = p.user 
        INNER JOIN privateallowed a on a.alloweduser=24
        WHERE u.private='public' or p.user = a.privateuser