简化我的数据库如下所示:
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中。
答案 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)