【问题标题】:How to use value from main query in subquery (MariaDB)如何在子查询(MariaDB)中使用主查询中的值
【发布时间】:2019-02-28 10:07:40
【问题描述】:

简介

我请你不要生气:StackOverflow 有很多以这个标题命名的主题。我重新阅读了它们,但我仍然有问题。也许我做错了什么,或者我有旧版本的 DBMS(我有 10.1.30 MariaDB)。

表格

1.@events_tag

id,
title

2.@events_tag_rel

event_id,
tag_id

2.@sessions

id,
event_id,
date_start

查询

SELECT et.* FROM events_tag et
WHERE EXISTS
(
    SELECT a_s.id FROM sessions a_s
    LEFT JOIN events_tag_rel a_etr ON a_etr.tag_id = et.id
    WHERE a_s.event_id = a_etr.event_id AND a_s.date_start >= NOW()
)

问题

我需要在子查询中使用来自主查询的数据。 具体来说,我正在尝试执行以下操作:从表 @events_tag 中获取与表 @events_tag_rel 存在关系的所有行(按列 @tag_id) 和表 @sessions(按列 @event_id)。

但我收到一条错误消息:

“on 子句”中的未知列“et.id”

【问题讨论】:

    标签: database subquery mariadb


    【解决方案1】:

    "from table @events_tag" -- 你的意思是表名是一个变量吗?如果不在应用程序代码或存储例程中构造查询,就无法做到这一点。后者将使用CONCATPREPAREEXECUTE

    ON 子句应指定两个表的关联方式。不要包含过滤子句。

    所以,改变

    FROM sessions a_s
    LEFT JOIN events_tag_rel a_etr ON a_etr.tag_id = et.id
    WHERE a_s.event_id = a_etr.event_id AND a_s.date_start >= NOW()
    

    FROM sessions AS s
    LEFT JOIN events_tag_rel AS etr  ON s.event_id = etr.event_id
    WHERE  etr.tag_id = et.id
      AND  s.date_start >= NOW()
    

    此外,LEFT 在这种情况下可能毫无用处。

    选择列表与EXISTS无关:

    EXISTS ( SELECT id FROM ... )
    

    -->

    EXISTS ( SELECT 1 FROM ... )
    

    可能有益的索引:

    etr:  INDEX(tag_id, event_id)     -- in either order
    s:    INDEX(date_start, event_id)
    s:    INDEX(event_id, date_start)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      相关资源
      最近更新 更多