如何完成这个功课SQL查询?

时间:2014-04-02 18:18:52

标签: mysql sql

这是我的家庭作业问题:

  

编写一个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:

screenshot

1 个答案:

答案 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,请务必解决问题,并了解查询文本的解释方式。

一些注意事项:

  • 不要在>=运算符中的两个字符之间放置空格(我相当确定它无效;即使它是,也不要这样做。)
  • AND是一个逻辑运算符,"foo >= x AND y"没有将"foo""y"进行比较,它将"foo >= x"评估为布尔值(返回true,false或null),它将"y"评估为布尔值(返回true,false或null),然后"AND"对两个布尔值进行逻辑AND运算。这是有效的语法,但它不是你想要的操作。
  • MySQL中的日期文字应始终采用'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(包括多个表,聚合,内联视图,复杂表达式,相关子查询等)。