Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL选择2个具有内部联接的表_Php_Mysql_Database - Fatal编程技术网

Php MySQL选择2个具有内部联接的表

Php MySQL选择2个具有内部联接的表,php,mysql,database,Php,Mysql,Database,我一直在研究一些MySQL连接,但这一个让我有点困惑。 我有3个表格,朋友,帖子和活动 表posts和activity都有一个表示记录所属用户的字段useridfriends包含表示两个用户是朋友的字段userid和friendsid 如果可能的话,我想设计一个查询,它将显示与登录用户是朋友的用户在posts和activity中的记录 我尝试了以下查询: SELECT p.*, a.* FROM posts AS p, activity AS a INNER JOIN frien

我一直在研究一些MySQL连接,但这一个让我有点困惑。 我有3个表格,
朋友
帖子
活动

posts
activity
都有一个表示记录所属用户的字段
userid
friends
包含表示两个用户是朋友的字段
userid
friendsid

如果可能的话,我想设计一个查询,它将显示与登录用户是朋友的用户在
posts
activity
中的记录

我尝试了以下查询:

SELECT p.*, a.*
    FROM posts AS p, activity AS a
    INNER JOIN friends f ON (p.userid = f.friendid)
    WHERE f.userid = '(Logged In User ID)'
但是,当我运行上述查询时,出现以下错误:

on子句中的未知列“p.userid”


任何帮助都将不胜感激:)

您可能需要一个
工会。如果两个表,
posts
activity
的列数相同(顺序相同,类型相似),则以下内容将起作用。如果没有,则需要在
选择
列表中进行一些调整:

SELECT p.*
    FROM posts AS p
        INNER JOIN friends f ON p.userid = f.friendid
    WHERE f.userid = '(Logged In User ID)'
UNION ALL
SELECT a.*
    FROM activity AS a
        INNER JOIN friends f ON a.userid = f.friendid
    WHERE f.userid = '(Logged In User ID)'
如果两个表具有不同的字段,则应调整两个选择列表,如下所示:

SELECT p.id
     , p.userid
     , p.post_text     AS text
     , p.post_date     AS date
     , NULL            AS action
    FROM posts AS p
    ...
UNION ALL
SELECT a.id
     , a.userid
     , NULL            AS text 
     , a.activity_date AS date
     , a.action        AS action
    FROM activity AS a
    ...

您可能需要一个
联合体
。如果两个表,
posts
activity
的列数相同(顺序相同,类型相似),则以下内容将起作用。如果没有,则需要在
选择
列表中进行一些调整:

SELECT p.*
    FROM posts AS p
        INNER JOIN friends f ON p.userid = f.friendid
    WHERE f.userid = '(Logged In User ID)'
UNION ALL
SELECT a.*
    FROM activity AS a
        INNER JOIN friends f ON a.userid = f.friendid
    WHERE f.userid = '(Logged In User ID)'
如果两个表具有不同的字段,则应调整两个选择列表,如下所示:

SELECT p.id
     , p.userid
     , p.post_text     AS text
     , p.post_date     AS date
     , NULL            AS action
    FROM posts AS p
    ...
UNION ALL
SELECT a.id
     , a.userid
     , NULL            AS text 
     , a.activity_date AS date
     , a.action        AS action
    FROM activity AS a
    ...
两件事:


永远不要在MySQL中使用显式连接,除非您必须这样做,否则它们可能会降低查询的性能,有时会非常严重

您的查询结构不正确。不能在连接a和f的on子句中使用p,只能使用a和f的引用,例如:

select p.*, a.*
  from posts p, activity a inner join friends f on (a.userid = f.friendid)...
最可能需要的是两个查询,如:

select a.* from activity a, friends f, users u
where a.userid = f.friendid
  and u.userid = f.userid;
  and u.userid = 'logged in user'

如果两个表都有相同的列,则可以使用类似于union的方式将它们放在一个查询中:

(select a.* from activity a, friends f, users u
    where a.userid = f.friendid
      and u.userid = f.userid
      and u.userid = 'logged in user'
) union (select p.* from posts p, friends f, users u
    where p.userid = f.friendid 
      and u.userid = f.userid
      and u.userid = 'logged in user')
如果它们不具有相同的列,则必须使两个选择的结果具有具有具有特定列和别名的相同列,或者返回到两个查询

如果需要从这个结果集中进行排序,则需要一个子查询,但请注意,MySQL中带有排序的子查询在应用程序逻辑中比在SQL中做得更好。其他数据库引擎在这方面做得更好。

两件事:


永远不要在MySQL中使用显式连接,除非您必须这样做,否则它们可能会降低查询的性能,有时会非常严重

您的查询结构不正确。不能在连接a和f的on子句中使用p,只能使用a和f的引用,例如:

select p.*, a.*
  from posts p, activity a inner join friends f on (a.userid = f.friendid)...
最可能需要的是两个查询,如:

select a.* from activity a, friends f, users u
where a.userid = f.friendid
  and u.userid = f.userid;
  and u.userid = 'logged in user'

如果两个表都有相同的列,则可以使用类似于union的方式将它们放在一个查询中:

(select a.* from activity a, friends f, users u
    where a.userid = f.friendid
      and u.userid = f.userid
      and u.userid = 'logged in user'
) union (select p.* from posts p, friends f, users u
    where p.userid = f.friendid 
      and u.userid = f.userid
      and u.userid = 'logged in user')
如果它们不具有相同的列,则必须使两个选择的结果具有具有具有特定列和别名的相同列,或者返回到两个查询

如果需要从这个结果集中进行排序,则需要一个子查询,但请注意,MySQL中带有排序的子查询在应用程序逻辑中比在SQL中做得更好。其他数据库引擎在这方面做得更好。

这里有几个问题:

  • 如果您对表使用别名,则不需要AS关键字。“从职位p”就足够了
  • 活动表没有任何约束,但它是select语句的一部分。这将进行自然联接,但会产生一个不好的笛卡尔乘积,并返回整个表,因为您没有按用户I'd进行过滤
  • 要解决问题2,您需要向where Claus添加另一个条件,如:

        AND a.userid = p.userid
    
    或添加另一个join子句:

       INNER JOIN activity a on a.userid = p.userid
    
    这里有几个问题:

  • 如果您对表使用别名,则不需要AS关键字。“从职位p”就足够了
  • 活动表没有任何约束,但它是select语句的一部分。这将进行自然联接,但会产生一个不好的笛卡尔乘积,并返回整个表,因为您没有按用户I'd进行过滤
  • 要解决问题2,您需要向where Claus添加另一个条件,如:

        AND a.userid = p.userid
    
    或添加另一个join子句:

       INNER JOIN activity a on a.userid = p.userid
    

    尝试将FROM表放在括号内:
    FROM(posts作为p,activity作为a)
    。尝试删除posts和p之间的AS。活动和a之间的as也是如此。p.userid=f.friendid+不需要括号,因为活动和其他两个表之间没有关系,所以cascadian产品不可避免地要把表放在括号内:
    FROM(posts AS p,activity AS a)
    。尝试删除posts和p之间的AS。活动和a之间的as也是如此。您不需要在p.userid=f.friendid+周围加括号,因为活动与其他两个表之间没有关系,所以cascadian产品是不可避免的。感谢您的帮助,如果这两个表有不同的字段,有什么方法可以让它工作吗<代码>活动
    有5个字段,而在
    帖子
    中有8个字段,除了主键和用户ID之外,这些字段几乎完全不同。简短的答案是否。长的答案可能是。有时,您可以使用视图来实现这一点,在视图中,您可以将结果映射到单个数据集,该数据集看起来像您可能希望发送给用户的数据集。如果它们仍然非常不同,那么您必须在应用程序层这样做。SQL数据库是高度结构化的,不能很好地处理任意数据。正如我在下面提到的,值得注意的是,在MySQL 5.1和更早版本的某些版本中,明确的内部联接肯定不是一个好主意。在双向联接中这是不相关的,但是一旦添加更多表,d