我需要编写一个查询,该查询将提取未分配给用户的所有硬件。我的表看起来像这样:
表:硬件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
行。
在我看来,这是更好的,因为它意味着你不存储不必要的数据。