代码之家  ›  专栏  ›  技术社区  ›  Hex

联合查询功能和查询结构

  •  0
  • Hex  · 技术社区  · 7 年前

    我试图实现的是在一个表中插入值,如果该值不存在于两个额外的表中。

    INSERT INTO visitor(
      visitor_username,
      email,
      PASSWORD
    )
    SELECT * FROM
    (
    SELECT
        'admin2000',
        'adminemail@mail.com',
        '123456'
    ) AS tmp
    WHERE NOT EXISTS
    (
    SELECT
        admin.admin_username,
        admin.email
    FROM
        admin AS admin
    WHERE
        admin.admin_username = 'admin2000' AND admin.email = 
    'adminemail@mail.com'
    UNION
    SELECT
    staff.staff_username,
    staff.email
    FROM
    staff AS staff
    WHERE
    staff.staff_username = 'admin2000' AND staff.email = 
    'adminemail@mail.com'
     )
    LIMIT 1
    

    在WHERE NOT EXIST部分,当我只要求*\u用户名(例如:admin\u username或staff\u username)时,它工作得很好,但当我需要验证电子邮件是否也存在时,它并没有按预期工作。

    2 回复  |  直到 7 年前
        1
  •  1
  •   GolezTrol    7 年前

    问题在于 AND admin2000 ,但使用不同的电子邮件地址,子查询将不会返回该admin,因此将插入新行。

    使用 OR 而不是 以及 ,问题就会得到解决。

        2
  •  0
  •   Gordon Linoff    7 年前

    您似乎想编写这样的查询:

    INSERT INTO visitor (visitor_username, email, PASSWORD)
        SELECT t.*
        FROM (SELECT 'admin2000' as visitor_username, 'adminemail@mail.com' as email, '123456' as PASSWORD
             ) t
        WHERE NOT EXISTS (SELECT 1
                          FROM admin a
                          WHERE a.visitor_username = t.visitor_username AND a.email = t.email
                         )
        UNION 
        SELECT s.staff_username, s.email, ? as password
        FROM staff s
        WHERE s.staff_username = 'admin2000' AND s.email = 
    'adminemail@mail.com';
    

    请注意,第二个子查询缺少密码,因此存在错误。

    INSERT INTO visitor (visitor_username, email, PASSWORD)
        SELECT t.*
        FROM (SELECT 'admin2000' as visitor_username, 'adminemail@mail.com' as email, '123456' as PASSWORD
             ) t
        WHERE NOT EXISTS (SELECT 1
                          FROM admin a
                          WHERE a.admin_username = t.visitor_username AND a.email = t.email
                         ) AND
              NOT EXISTS (SELECT 1
                          FROM staff s
                          WHERE s.staff_username = t.visitor_username AND s.email = t.email
                         );