如何从一个表中选择不在其他表中的所有行?
Posted
技术标签:
【中文标题】如何从一个表中选择不在其他表中的所有行?【英文标题】:How to select all rows from a table which are not in other table? 【发布时间】:2021-01-07 14:43:56 【问题描述】:我在 mysql 数据库 (mariaDB) 名称 products 和 order 中有 2 个表。
在产品表中有 productid 列,其类型为 int(11)
并设置为主键以及自动增量。虽然订单表有 productid 列的引用
名称是不相同,并且没有使用外键。 order
表中的列名设置为pid
,类型为varchar
。
我想要 products
表中 productid
不存在于 order
表中的所有行。
这个数据库被安卓应用程序和网络应用程序使用。所以像重命名列这样的重大改变是不可行的。
我目前的方法是使用编程。从products
中获取所有productid
的列表,然后在order
表中一一搜索。这需要很多时间,因为表中的产品数量约为 500k
有没有其他方法可以做到这一点?
【问题讨论】:
请注意,order
是 MySQL 中的保留字,使其作为表/列标识符的选择很糟糕。如需更多帮助,请参阅meta.***.com/questions/333952/…
【参考方案1】:
您可以简单地进行查询以获取产品:
SELECT products.productid, order.orderid
FROM products
LEFT JOIN order ON order.pid = products.productid
WHERE order.orderid IS NULL
【讨论】:
【参考方案2】:您可能想查看“存在”语句。
您的请求如下所示
SELECT *
FROM products
WHERE
NOT EXISTS
(SELECT 1 FROM orders
WHERE orders.productid = products.productid);
还有其他可能性,我不是 DB 方面的专家,无法进一步讨论它们的优点,但您可以在 Subqueries with EXISTS vs IN - MySQL 上阅读更多相关信息。根据我自己的经验(可能与您的相同或不同),我发现使用“EXISTS”更容易阅读且性能足够
【讨论】:
【参考方案3】:SELECT products.productid
LEFT JOIN `order`
ON(products.productid=CAST(`order`.pid AS INTEGER))
WHERE `order`.pid is null;
【讨论】:
以上是关于如何从一个表中选择不在其他表中的所有行?的主要内容,如果未能解决你的问题,请参考以下文章