MySQL:table1中的SELECT字段不在table2

时间:2017-05-31 07:36:09

标签: mysql sql

简化我的数据库如下所示:

CREATE
TABLE vinyls (
    id_vinyl INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,                  
    PRIMARY KEY (id_vinyl),
    UNIQUE KEY id_vinyl (id_vinyl));

CREATE
TABLE orders (
    id_order INT(10) UNSIGNED NOT NULL,                               
    PRIMARY KEY (id_order),
    UNIQUE KEY id_order (id_order));  

CREATE
TABLE orders_vinyls (
    id_order INT(10) UNSIGNED NOT NULL,
    id_vinyl INT(11) UNSIGNED NOT NULL,
    PRIMARY KEY (id_order, id_vinyl),
    UNIQUE KEY id_vinyl (id_vinyl),
    FOREIGN KEY (id_order) REFERENCES orders (id_order) ON DELETE CASCADE,
    FOREIGN KEY (id_vinyl) REFERENCES vinyls (id_vinyl) ON DELETE CASCADE);

它的设计包含一个包含多个乙烯基的订单 - table orders_vinyls。 我需要获得可供客户使用的乙烯基。 那些id_vinyl不在表orders_vinyls中的那些。 可能有一种情况 当orders_vinyls为空时,这会给我带来一些困难。

我很感激你的帮助。

更新: 例如 表乙烯基:(1),(2),(3),(4),(5),(6);

表格顺序:(1),(2),(3)

表orders_vinyls:(1,1),(1,2),(2,3),(3,4)

所以我需要获得id_vinyl 5或6的乙烯基,因为它们不在表order_vinyls中。

3 个答案:

答案 0 :(得分:2)

如果您想要的是选择任何订单中不存在的乙烯基,那么一个选项就是使用NOT EXISTS

SELECT v.*
FROM vinyls AS v
WHERE NOT EXISTS (SELECT 1
                  FROM orders_vinuls AS ov 
                  WHERE ov.id_vinyl = v.id_vinyl)

如果表orders_vinuls为空,这也适用。

答案 1 :(得分:0)

如果我正确理解您的问题,您可以使用设置差异操作except

select id_vinyl from vinyls
except
select id_vinyl from orders_vinyls

如果您的实际乙烯基表更复杂,您可以使用上面与原始表连接的查询结果,或者您可以使用不同的查询

select  *
from    vinyls
where   id_vinyl not in (
            select id_vinyl from orders_vinyls
        )

答案 2 :(得分:0)

您可以使用NOT EXISTS

Select * from table1 a
Where not exists (select 1 from table2  b where b.vynil_id = a.vynil_id)