2

我有三个表:

帖子:id、标题、authorId、文本

作者:身份证、姓名、国家

注释:id、authorId、text、postId

我想运行一个 mysql 命令,它选择由作者撰写的前 5 篇文章,作者的国家是“爱尔兰”。在同一个调用中,我想检索这五个帖子的所有评论,以及作者信息。

我尝试了以下方法:

SELECT posts.id as 'posts.id', posts.title as 'posts.title'  (etc. etc. list all fields in three table)
FROM 
(SELECT *  FROM posts, authors WHERE authors.country = 'ireland' AND authors.id = posts.authorId LIMIT 0, 5 ) as posts 
LEFT JOIN 
comments ON comments.postId = posts.id, 
authors 
WHERE
authors.id = posts.authorId

我必须用别名 ^ 包含每个字段,因为 id 有一个重复项,并且将来更多字段可能会重复,因为我正在寻找一个通用的解决方案。

我的两个问题是:

1)我从我的子选择中获得了一个重复的字段条目作为id,所以我必须在子选择中再次列出我的所有字段作为别名,还是我只需要一个字段作为子选择

2)有没有办法让我的电话自动别名?目前,我刚刚为主选择中的每个字段添加了别名,但它可以为我执行此操作,因此没有重复项吗?

抱歉,如果这不是很清楚,这是一个有点混乱的问题!谢谢。

4

2 回答 2

2

您正在对author查询中的表进行不必要的连接。您可以在posts子查询中获得所需的所有字段。我会将其重命名为现有表以外的名称,也许是pa为了指示帖子和作者。

你说你想要前 5 个帖子,但没有 order 子句。更好的查询形式是:

SELECT pa.id as 'posts.id', pa.title as 'posts.title'  (etc. etc. list all fields in three table)
FROM (SELECT *
      FROM posts join
           authors
           on authors.id = posts.authorId
      WHERE authors.country = 'ireland'
      order by post.date
      LIMIT 0, 5
     ) pa LEFT JOIN 
     comments c
     ON c.postId = pa.id

请注意,这将返回前五个帖子及其作者(如问题中所述)。但一位作者可能负责所有五篇文章。

在 MySQL 中,您可以使用*它来消除from子句中的重复别名。我认为这很危险。最好列出您想要的所有列。

于 2013-04-30T16:06:51.397 回答
1

要回答您的问题:

  1. 您可以根据需要从子查询中选择尽可能多(或尽可能少)的列
  2. 您不需要authors再次加入表,因为您已经选择了子查询中的所有字段(因此摆脱了重复的列名)。

一些补充说明...

...关于JOIN语法

更喜欢形式

FROM t1 JOIN t2 ON (t1.fk = t2.pk)

过时的,晦涩的

FROM t1, t2 WHERE t1.fk = t2.pk

...关于使用LIMIT没有子句的ORDER BY子句

SELECT没有子句的语句返回行的顺序ORDER BY是未定义的。因此,理论上LIMIT n没有子句的ORDER BY子句可以返回任何n行。

您的最终查询应如下所示:

SELECT *
FROM (
    SELECT *
    FROM posts
    JOIN authors ON (authors.id = posts.authorId )
    WHERE authors.country = 'ireland'
    ORDER BY posts.id DESC -- assuming this column is monotonically increasing
    LIMIT 5
) AS last_posts 
LEFT JOIN comments ON ( comments.postId = last_posts .id )
于 2013-04-30T16:09:50.330 回答