MySQL NOT IN with condition


MySQL NOT IN with condition

我需要编写一个查询,该查询将提取未分配给用户的所有硬件。我的表看起来像这样:

表:硬件ID、brand、date_of_purchase、purchase_price、serial_number、invoice_location

表:assigned_equipment ID, user_id, object_id, object_type, is_assigned, date_assigned

一旦将一块硬件签出给用户,就会在assignd_equipment中创建一个新条目,并将列is_assigned设置为1。如果稍后未赋值,该值可以为0。

话虽这么说,我的查询看起来像这样:SELECT * FROM hardware WHERE ID NOT IN (SELECT object_id FROM assigned_equipment);

我需要一个条件语句,它将添加WHERE is_assigned = 0,否则如果有一个条目它将不列出。想法吗?

简单地扩展子查询以只包含已分配的项:

SELECT * FROM hardware 
WHERE ID NOT IN 
  (SELECT object_id FROM assigned_equipment WHERE is_assigned = 1);

因此,每个匹配的id都不在子选择中-因此未分配。

带有is_assigned=0的赋值表中的列不再是子结果的一部分,因此是外部结果的一部分。

如果没有JOIN就不能这样做,所以应该放弃子选择。

SELECT 
    hardware.* 
FROM 
    hardware h 
LEFT JOIN 
    assigned_equipment e 
ON (e.object_id = h.id) 
WHERE 
    e.id IS NULL 
    OR 
    (e.is_assigned = 0 AND e.user_id = ?);

如果您采用语义方法,那么is_assigned列应该不需要-因为只有分配的项应该出现在assigned_equipment表中。

这将使你的查询:

SELECT *
FROM `hardware`
WHERE `id` NOT IN (
    SELECT `object_id`
    FROM `assigned_equipment`
);

这当然意味着当一个项变为未分配时,您可以从assigned_equipment表中DELETE行。

在我看来,这是更好的,因为它意味着你不存储不必要的数据。