【问题标题】:I'm trying to only get one row from a LEFT JOIN我试图从 LEFT JOIN 中只得到一行
【发布时间】:2017-03-29 01:23:01
【问题描述】:

临时订购表

temp_id     series_id   news_ticket_breakdown_id    quantity    expiry_time
58db09bba25b4   2                  2                     2       1490750973
58db09bba25b4   2                  4                     1      1490750973

新闻项目表

news_id   series_id      news_title
   26          2         GENERIC TICKETING
   27          2         GENERIC TICKETING

当我对 series_id 进行左连接时,我返回 4 行,我只想要 2 行。我不确定如何将连接的行数限制为一行。

当前查询

SELECT 
    * 
FROM 
    ticket_ordering_temp    
LEFT JOIN 
    news_items 
on 
    ( news_items.series_id = SELECT 
                                DISTINCT(event_id)
                             FROM 
                                news_items 
                             where 
                                series_id=ticket_ordering_temp.series_id
    )
where 
    temp_id='58db09bba25b4''

期望的结果 我只想要表 2 中的 1 行,而不是如上所述加入的 2 行

temp_id     series_id   news_ticket_breakdown_id    quantity    expiry_time news_title
58db09bba25b4   2                  2                     2       1490750973  GENERIC TICKETING
58db09bba25b4   2                  4                     1      1490750973 GENERIC TICKETING

【问题讨论】:

  • 你的JOIN条件是什么?
  • 我在表定义或示例数据中都没有看到event_id
  • 你为什么要尝试左连接而不是连接?
  • 这在现代数据库引擎中通过横向连接/应用很容易,自 sql:1999 以来这一直是 ansi 标准的一部分。可悲的是,MySql 不再是真正的现代数据库引擎。它已经落后了十多年,没有与其他主要参与者并驾齐驱。
  • 你想要哪个 news_id 值? 26 还是 27?这对您来说似乎无关紧要,因为您的两个样本都具有相同的 GENERIC TICKETING news_title 值,但数据库不知道这一点。从数据库的角度来看,这些仍然是 不同 记录,它们都与您的连接匹配,它只查看 series_id 值。

标签: mysql sql join left-join


【解决方案1】:

对于您的示例数据和您想要的结果,您可以尝试以下 sql 来做:

SELECT 
    ticket_ordering_temp.*, t.news_title
FROM 
    ticket_ordering_temp    
LEFT JOIN( 
    SELECT DISTINCT series_id, news_title
    FROM news_items
) t ON ticket_ordering_temp.series_id = t.series_id
WHERE temp_id = '58db09bba25b4'

但是,我认为您应该告诉我们这些示例数据背后的逻辑。

Demo in SqlFiddle

【讨论】:

  • 很好的答案...谢谢,当我清醒一点时,我需要仔细分析一下。
【解决方案2】:

用 tempTable 试试这个查询:

select distinct * from
(select  * from 
(select '58db09bba25b4' as temp_id,   2 as series_id,2 as news_ticket_breakdown_id,2 as quantity,1490750973 as  expiry_time  union all
select '58db09bba25b4' ,  2   ,              4  ,                  1,     1490750973) as tbl_order) as tbl_order

left join


(select series_id,news_title from 
(select  26 as  news_id,         2 as series_id,         'GENERIC TICKETING' as news_title union all
select   27  ,        2 ,        'GENERIC TICKETING') as tbl_items) tbl_items
on tbl_order.series_id = tbl_items.series_id where temp_id ='58db09bba25b4'

用实际表查询:

select DISTINCT * from
(select temp_id,series_id,news_ticket_breakdown_id,quantity,expiry_time from tbl_order) as tb_order
left join
(select series_id,news_title from tbl_items) as tb_items
on tb_order.series_id = tb_items.series_id where temp_id ='58db09bba25b4'

结果:

58db09bba25b4   2   2   2   1490750973  2   GENERIC TICKETING
58db09bba25b4   2   4   1   1490750973  2   GENERIC TICKETING

只是给出另一个解决方案。

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2013-03-15
    • 2019-07-09
    相关资源
    最近更新 更多