我有三张表:
文章: 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)有没有办法自动调用我的电话?目前我只是在主要选择中的每个字段别名但是它可以为我做这个,所以没有重复吗?
对不起,如果这不是很清楚,这有点乱的问题!感谢。
答案 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)
回答你的问题:
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 )