【问题标题】:How to retrieve all entries with JOIN?如何使用 JOIN 检索所有条目?
【发布时间】:2011-10-13 15:18:26
【问题描述】:

这是我的问题:

enter code here

我有一个名为 test 的表,看起来像这样

id|  service  |   sub service  | Qt  |   date

1 | service_1 | sub_service_11 |  3  | 2011-12-03
2 | service_1 | sub_service_12 |  6  | 2011-12-03
3 | service_1 | sub_service_13 |  4  | 2011-12-03

后来我有一个名为 datedim 的表,看起来像这样

id|   date 

1 | 2011-12-01
2 | 2011-12-02
3 | 2011-12-03
4 | 2011-12-04
5 | 2011-12-05

我想要做的是,对于每个 sub_service,即使没有匹配项,也可以从 datedim 中恢复所有日期。

所以基本上看起来像这样的东西

sub_service_11 | 2011-12-01 | NULL
sub_service_11 | 2011-12-02 | NULL
sub_service_11 | 2011-12-03 | 3
sub_service_11 | 2011-12-04 | NULL
sub_service_11 | 2011-12-05 | NULL
sub_service_12 | 2011-12-01 | NULL
sub_service_12 | 2011-12-02 | NULL
sub_service_12 | 2011-12-03 | 6
sub_service_12 | 2011-12-04 | NULL
sub_service_12 | 2011-12-05 | NULL
sub_service_13 | 2011-12-01 | NULL
sub_service_13 | 2011-12-02 | NULL
sub_service_13 | 2011-12-03 | 4
sub_service_13 | 2011-12-04 | NULL
sub_service_13 | 2011-12-05 | NULL

我确实尝试过 RIGHT JOIN、UNIONS 和其他东西,但我无法弄清楚。

有谁知道我如何做到这一点?

谢谢,

【问题讨论】:

  • 您是否有一个表格列出了所有可能的 sub_service,或者您是否只有“DISTINCT sub_service FROM test”?
  • 我确实有一个包含 sub_service 列表的表。没想到我可以加入两次,在 sub_service 和 datedim 上。

标签: mysql sql join union


【解决方案1】:

这是你需要的:

select 
  ss.sub_service, 
  dd.date,
  ts.qt
from 
  (datedim dd, (select distinct sub_service from test) ss)
 left join test ts on (dd.date = ts.date and ts.sub_service = ss.sub_service)
order by ss.sub_service, dd.date

【讨论】:

  • 一旦您将另一个日期添加到测试中(例如 sub_service_11、2011-12-04),这将为该 sub_service 生成重复的日期。
  • @Adrian 非常感谢我永远找不到这个解决方案。非常感谢您的帮助。
【解决方案2】:

由于您有一个包含每个 sub_service 的表(我们称之为 sub_service_list),您应该能够执行以下操作:

SELECT
s.sub_service, d.date, t.Qt
FROM (sub_service_list s,datedim d) 
LEFT JOIN test t ON s.sub_service=t.sub_service AND d.date=t.date

【讨论】:

    【解决方案3】:

    你可以这样做:

    select t.id, sub_service, case when d.date = t.date then qt else null end as qt
    from test t cross join datedim d 
    order by sub_service, d.date
    

    【讨论】:

    • > 在 MySQL 中,CROSS JOIN 相当于 INNER JOIN 的句法(它们可以相互替换)dev.mysql.com/doc/refman/5.0/en/join.html 这不会解决 OP 问题
    • 是的,Adrian……你还是测试了查询?只知道是否工作
    • 是的,我做到了。输出不是 OP 想要的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    相关资源
    最近更新 更多