SQL Query使用EXISTS

时间:2016-12-10 07:43:17

标签: mysql sql database

我有以下查询从事件表中提取事件。

目标:我想从事件表中选择事件,但首先要查看已登录的用户是否已参加该事件。 如果是,则不要显示该事件。

我有一个注册表,它是'users'和'events'表之间的'事务'表。 “用户”表中的字段“ID”是PK,其FK位于“客户”字段下的“注册”表中。 'events'表中的字段'ID'是PK,'signup'表中的FK是字段'eid'。

到目前为止我所拥有的:

SELECT
    id,
    name,
    DATE_FORMAT(
        date,
        '%W, %b %e %Y %l:%i %p'
    ) date,
    date orderByDate,
    shortDesc,
    summary,
    street,
    city,
    state,
    zip,
    private
FROM
    events
WHERE
    zip = 93101
AND approved = 1
AND date > sysdate();

我觉得我需要使用关键字EXISTS来首先检查并查看登录用户是否在“注册”表中存在记录,但是我那可怜的农民大脑似乎无法弄清楚查询。 感谢所有帮助,到目前为止,每个人都对我的所有SQL问题感到非常惊讶。还在学习很多东西。 :)

2 个答案:

答案 0 :(得分:1)

您需要not exists,因为您想在signup表中获取给定用户没有相应记录的记录:

SELECT id, name, DATE_FORMAT(date, '%W, %b %e %Y %l:%i %p') date, date orderByDate, shortDesc, summary, street, city, state, zip, private 
        FROM events 
        WHERE zip = 93101 
        AND approved = 1 
        AND date > sysdate()
        AND NOT EXISTS (SELECT 1 FROM signup WHERE signup.eid=events.id and signup.customer=...);

替换用户ID代替...

答案 1 :(得分:0)

假设您已经拥有要为其获取事件的userId,您的查询可能看起来像 -

SELECT
    id,
    name,
    DATE_FORMAT(
        date,
        '%W, %b %e %Y %l:%i %p'
    ) date,
    date orderByDate,
    shortDesc,
    summary,
    street,
    city,
    state,
    zip,
    private
FROM
    events
WHERE
    zip = 93101
AND approved = 1
AND date > sysdate()
AND id NOT IN (
    SELECT
        eid
    FROM
        signup
    WHERE
        customer == <your-customer-id>
);