【问题标题】:How to select results from table #1 filtered by results in table #2?如何从表 #1 中选择由表 #2 中的结果过滤的结果?
【发布时间】:2012-01-30 10:51:03
【问题描述】:

嗯,我有两张桌子:

  • eventsidtitledescription
  • trip_eventsidevent_id(指向events.id

我需要从名为 events 的表中选择结果。

SELECT *
FROM `events`

就这么简单,对吧?

我需要实现的是我需要从events 中选择结果,但排除trip_events 中的那些行(如果events.id != trip_events.event_id排除)。

示例如下:

events:

  • id : 5,
  • id6
  • id : 7,
  • id : 8;

trip_events:

  • event_id : 6,
  • event_id : 8;

使用此数据集,只会返回 id 为 56 的事件。

如何做到这一点?

我试过这样:

SELECT *
FROM `events`
JOIN `trip_events`
ON (`trip_events`.`event_id` = `events`.`id`)
WHERE `trip_events`.`event_id` != `events`.`id`

但它没有用。

【问题讨论】:

    标签: mysql sql join filter


    【解决方案1】:
    select * from events where id not in
    (select event_id from trip_events)
    

    编辑:
    作为旁注,ON 条件可以被认为是WHERE 条件。您的查询结果将与以下相同

    SELECT *
    FROM `events`
    JOIN `trip_events`
    ON 1 = 1
    WHERE (`trip_events`.`event_id`  = `events`.`id`)
    AND   (`trip_events`.`event_id` != `events`.`id`)
    

    猜猜你为什么没有得到任何结果!

    【讨论】:

    • 无论如何,出于性能原因,我认为加入解决方案会更好。
    • @4ndrew,是的,可能是,但只要性能不是问题(并且连接查询实际上更快),我认为这在其意图上更具可读性和明显性。左连接成语是众所周知的,但是您需要知道成语并确定使用的成语,然后才能阅读代码。
    • @4ndrew:在您使用数据进行测试之前,您无法知道什么更快。据我所知,NOT INNOT EXISTSLEFT JOIN - IS NULL 具有相似的性能。
    • @Albin:+1 说明 OP 查询失败的原因。
    【解决方案2】:

    解决此问题的另一种方法(使用左连接而不是子选择):

    SELECT events.id from events
        LEFT JOIN trip_events on events.id = trip_events.event_id
        WHERE trip_events.event_id is null;
    

    在某些情况下,从性能角度来看,它可能比 @Albin Sunnanbo 提出的带有子选择的变体更好,这取决于您使用的 SQL 服务器(在这种情况下,某些服务器执行更好的优化,两种变体提供相同的性能)。

    【讨论】:

    • 查询正确但不是内连接。这是一个(左)外连接。
    • @ypercube Ops,对不起,这是一个错字。固定。
    【解决方案3】:
    select * 
    from events e 
    where not exists (
        select 1 from trip_events t 
        where t.event_id = e.id
    )
    

    【讨论】:

      【解决方案4】:

      试试下面的查询:

      选择 * 来自events WHERE id 不在(从 trip_events 中选择 event_id)

      【讨论】:

        猜你喜欢
        • 2021-12-03
        • 2013-07-04
        • 1970-01-01
        • 2019-08-13
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        • 1970-01-01
        相关资源
        最近更新 更多