[英]MySQL SELECT 2 tables with an INNER JOIN
我一直在从事一些MySQL Joins的工作,但这使我有些困惑。 我有3张桌子, friends
, posts
和activity
。
表格posts
和activity
都具有字段userid
,该字段代表该记录所属的用户。 friends
包含userid
和friendid
字段,以表示两个用户成为朋友。
如果可能,我想设计一个查询,该查询将显示与登录用户成为好友的用户在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)'
但是,当我运行上述查询时,出现以下错误:
Unknown column 'p.userid' in 'on clause'
任何帮助将非常感激 :)
您可能需要一个UNION
。 如果两个表, posts
和activity
的列数相同(顺序相同且类型相似),则以下内容将起作用。 如果不是,则需要在SELECT
列表中进行一些调整:
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'
和
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'
如果两个表都具有相同的列,则可以使用诸如并集的形式将两个表放在一个查询中:
(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。 其他数据库引擎对此拥有更好的时机。
这里有几个问题:
要解决问题2,您需要向where Claus添加另一个条件,例如:
AND a.userid = p.userid
或添加另一个join子句:
INNER JOIN activity a on a.userid = p.userid
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.