这是我的家庭作业问题:
编写一个SQL查询,该查询返回来自user_id,用户名,来自表'用户'的标题,'文章','评论'的内容。所有文章都是在2013年创建的。
到目前为止,这是我的解决方案:
Select user_id, users_username, users_email, articles_title, articles_created, comments_content
from comments
inner join users
on comments.user_id = users.id
inner join users
on comments.articles_id = articles.id
where created > = '2013/01/01' AND '2014/01/01';
这是ERD:
答案 0 :(得分:3)
此查询应返回指定的结果集:
SELECT u.id AS user_id
, u.username
, u.email
, a.title
, c.created
, c.content
FROM comments c
JOIN users u
ON u.id = c.user_id
JOIN articles a
ON a.id = c.articles_id
WHERE c.created >= '2013-01-01'
AND c.created < '2014-01-01'
ORDER BY u.id, c.created
如果您想了解SQL,请务必解决问题,并了解查询文本的解释方式。
一些注意事项:
>=
运算符中的两个字符之间放置空格(我相当确定它无效;即使它是,也不要这样做。)"foo >= x AND y"
没有将"foo"
与"y"
进行比较,它将"foo >= x"
评估为布尔值(返回true,false或null),它将"y"
评估为布尔值(返回true,false或null),然后"AND"
对两个布尔值进行逻辑AND运算。这是有效的语法,但它不是你想要的操作。'YYYY-MM-DD'
形式; MySQL的后续版本对分隔符以及月和日的两个位置更宽松,但是四个破折号 - 双破折号 - 两种格式是标准。"users_username"
引用是无效的标识符。在查询引用的任何表中,该名称都没有任何列。看起来您的意思是指定"username"
表中的"users"
列,该列将被引用为"users.user_name"
,使用点字符分隔两个标识符。与SELECT列表中的其他列引用相同"INNER"
关键字是多余的,它是不必要的,并且在查询中没有区别;在MySQL中"JOIN"
和"INNER JOIN"
是同义词。 (它也是"CROSS JOIN"
的同义词,虽然我们通常在没有连接谓词的情况下包含"CROSS"
关键字,即使它不是必需的。这主要是未来读者的文档辅助工具,他将是在寻找JOIN谓词时,"CROSS"
关键字为他们提供了一条线索,即“缺失的”JOIN谓词是有意的,而不仅仅是错误或疏忽。另请注意:SQL语句的读取次数比WRITTEN多很多次;因此,格式化SQL,以便读者轻松解读和理解语句正在做什么。
例如,将上面的查询与等效项进行比较:
select users.id as user_id,users.username as username,users.email as email,articles.title,
comments.created, comments.content from comments inner join users on comments.user_id=
users.id join articles on comments.articles_id=articles.id where comments.created >=
'2013-01-01' and comments.created < '2014-01-01' order by users.id, comments.created
然后回答以下问题,查看SQL:
SQL的格式化有助于未来的读者。真正的好处在于更复杂的SQL(包括多个表,聚合,内联视图,复杂表达式,相关子查询等)。