繁体   English   中英

MySQL SELECT 2表和一个INNER JOIN

[英]MySQL SELECT 2 tables with an INNER JOIN

我一直在从事一些MySQL Joins的工作,但这使我有些困惑。 我有3张桌子, friendspostsactivity

表格postsactivity都具有字段userid ,该字段代表该记录所属的用户。 friends包含useridfriendid字段,以表示两个用户成为朋友。

如果可能,我想设计一个查询,该查询将显示与登录用户成为好友的用户在postsactivity的记录。

我尝试了以下查询:

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 如果两个表, postsactivity的列数相同(顺序相同且类型相似),则以下内容将起作用。 如果不是,则需要在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。 其他数据库引擎对此拥有更好的时机。

这里有几个问题:

  1. 乳清使用表的别名,您不需要AS关键字。 “从职位p”就足够了。
  2. 您对活动表没有任何限制,但这是select语句的一部分。 这将进行自然连接,但会产生不好的笛卡尔积,并且会返回整个表,因为您没有按我想要的用户进行过滤。

要解决问题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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM