如何用条件和限制正确编写mysql subselect

时间:2013-04-30 15:51:38

标签: mysql sql

我有三张表:

文章: id,title,authorId,text

作者: id,name,country

评论: 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)我从我的subselect中获取id的重复字段条目,所以我是否必须在subselect中再次列出我的所有字段作为别名,或者只有一个字段我需要用于subselect

2)有没有办法自动调用我的电话?目前我只是在主要选择中的每个字段别名但是它可以为我做这个,所以没有重复吗?

对不起,如果这不是很清楚,这有点乱的问题!感谢。

2 个答案:

答案 0 :(得分:2)

您正在执行不必要的联接回到查询中的author表。您可以在posts子查询中获得所需的所有字段。我会将此重命名为现有表格以外的其他内容,可能pa表示帖子和作者。

你说你想要前5个帖子,但没有订单条款。更好的查询形式是:

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子句中删除重复的别名。我觉得这很危险。最好列出您想要的所有列。

答案 1 :(得分:1)

回答你的问题:

  1. 您可以根据需要从子查询中选择任意数量的列(或少数列)
  2. 您不需要再次加入authors表,因为您已经选择了子查询中的所有字段(因此请删除重复的列名称)。
  3. 一些额外的评论......

    ...关于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 )