【问题标题】:How to finish this homework SQL query?如何完成这个作业 SQL 查询?
【发布时间】:2014-04-02 18:18:51
【问题描述】:

这是我的作业问题:

编写一个 SQL 查询,返回 user_id、用户名、来自表 'user' 的电子邮件、'article' 的标题、'cmets' 的内容,所有文章都是在 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:

【问题讨论】:

  • 我建议你包括你到目前为止所得到的,即使它只是SELECT * FROM users,并提出一个问题。仅仅粘贴你的家庭作业问题不会给你任何分数。
  • 我确实包括了我的工作......
  • where created > = '2013/01/01' AND '2014/01/01' 不会像您认为的那样做。你可能想要where created >= '2013/01/01' AND created < '2014/01/01'where created BETWEEN '2013/01/01' AND '2013/12/31'
  • @MarcusAdams:他说“创建于 2013 年”。我假设他不想要'2014/01/01'
  • @RocketHazmat,MySQL 能识别这种格式的日期吗?

标签: mysql sql


【解决方案1】:

这个查询应该返回指定的结果集:

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

一些注意事项:

  • 不要在&gt;= 运算符中的两个字符之间放置空格(我很确定这是无效的;即使是,也不要这样做。)
  • AND 是一个逻辑运算符,"foo &gt;= x AND y" 不是将 "foo""y" 进行比较,而是将 "foo &gt;= x" 评估为布尔值(返回 true、false 或 null),将 "y" 评估为布尔值(返回真、假或空),然后"AND" 对两个布尔值进行逻辑与运算。这是有效的语法,但不是您想要的操作。
  • MySQL 中的日期文字应始终采用'YYYY-MM-DD' 的形式; MySQL 的更高版本对分隔符和月份和日期的两个位置更加宽松,但标准是四连线二连线二格式。
  • 最佳做法是使用表名或表别名来限定列引用,点字符将表名/别名与列分开
  • 您查询中的"users_username" 引用是无效标识符。在查询引用的任何表中都没有该名称的任何列。看起来您的意思是从"users" 表中指定"username" 列,该列将被引用为"users.user_name",使用点字符分隔两个标识符。 SELECT 列表中的其他列引用也是如此
  • "INNER"关键字是多余的,没必要,对查询没有影响;在 MySQL 中 "JOIN""INNER JOIN" 是同义词。 (它也是 "CROSS JOIN" 的同义词,尽管我们通常会在没有连接谓词时包含 "CROSS" 关键字,即使它不是必需的。这主要是为将来的读者提供文档帮助,他们将寻找 JOIN 谓词,"CROSS" 关键字为他们提供了一个线索,即“缺失”的 JOIN 谓词是故意的,而不仅仅是错误或疏忽。

另请注意:一条 SQL 语句的读取次数多于写入次数;因此,请格式化 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:

  • 此查询返回多少列?
  • 从 cmets 表返回了哪些列?
  • 涉及多少张表?
  • 有外连接操作吗?
  • 选择列表中是否有任何聚合?

SQL 的格式对以后的读者有帮助。真正的好处在于更复杂的 SQL(涉及多个表、聚合、内联视图、复杂表达式、相关子查询等)。

【讨论】:

  • 非常感谢斯宾塞!
  • 我将在此处添加 +1,但我对向那些表现出有限努力的人提供如此多的帮助持保留态度,两次。对于这是否有助于他们自己的学习过程,我有两种看法,但可以肯定的是,它对打击帮助吸血鬼的一般斗争没有帮助。
  • @halfer:我明白你在说什么,我同意你的看法;但 OP 确实通过发布问题努力寻求帮助。我认为几个示例可以帮助弥合文档中稀疏示例和使一些代码正常工作之间的差距。好榜样总比坏榜样好。
猜你喜欢
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多