Php MySQL选择2个具有内部联接的表
我一直在研究一些MySQL连接,但这一个让我有点困惑。 我有3个表格,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
朋友
,帖子
和活动
表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