【问题标题】:Join three tables with CROSS JOIN使用 CROSS JOIN 连接三个表
【发布时间】:2018-12-01 00:59:08
【问题描述】:

我有三张桌子:

student:        sub:           marks:

id | name     id | sub         stud_id | sub_id | marks
---+--------  ---+------------  --------+----------+------
 1 | Peter     1 | English            1 |        1 |    80
 2 | Alice     2 | Maths              1 |        2 |    70
               3 | History            2 |        1 |    90
                                      2 |        2 |    80

我需要做一个返回这个的查询:

 name  | subjects  | marks
-------+-----------+----------------------------
  Peter | English  | 80
  Peter | Maths    | 70
  Peter | History  | 0

这是我尝试过的:

select * 
from student s 
LEFT JOIN stud_marks m ON s.id = m.stud_id 
RIGHT JOIN subjects sub ON sub.id = m.sub_id

让我感动

姓名 |标记|子 ------+--------+---------- 彼得 | 80 |英语 彼得 | 70 |数学 爱丽丝 | 90 |英语 爱丽丝 | 80 |数学 | |历史

有什么想法吗?

【问题讨论】:

  • 您的预期结果是什么?
  • “我试过”和“得到奇怪的结果”是什么意思?期望的输出如何成为输入的函数? “任何想法”都不是适合 SO 的问题。请阅读How to Askminimal reproducible example 并采取行动。另外:总是用谷歌搜索你的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,有和没有你的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用一个变体搜索您的标题和关键字作为您的标签。 PS您的标题表明您可能需要将单独的聚合连接在一起。
  • 总是发布你尝试过的和得到的输出
  • 我尝试使用上面的表格来获得下面一张的输出。我用 SQL QUERY(select * from student s LEFT JOIN stud_marks m ON s.id = m.stud_id RIGHT JOIN subject sub ON sub.id = m.sub_id) 尝试了什么。但我得到了一些不想要的结果。
  • 正如您在标题中所说:您需要交叉连接,而您的查询中没有。然后我建议永远不要使用右外连接。它们比左外连接更难阅读。我理解您查询背后的想法,但它的作用是让所有学生获得分​​数,然后您说您想要所有科目,即使该科目没有学生得分,这就是您得到的;一个额外的空白历史记录行。

标签: mysql join left-join inner-join right-join


【解决方案1】:

你会交叉加入彼得和所有的潜艇。然后外连接标记:

select
  peter.name,
  sub.sub,
  coalesce(marks.marks, 0) as marks
from (select * from student where id = 1) peter
cross join sub
left join marks on marks.stud_id = peter.id and marks.sub_id = sub.id
order by sub.sub;

(实际上没有必要在子查询中选择 Peter,但我认为这很清楚我们在这里做什么。我们也可以用标记交叉连接学生,并在 WHERE 子句中将其限制为 Peter。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2015-07-28
    • 2018-11-07
    • 2011-04-12
    相关资源
    最近更新 更多