2009-09-25 93 views
1

对于第一个表中的每个项目,都有一个'numberOf'字段。该字段的值在相关表中必须具有相同的行数。这些就像保留行一样,因此多个用户可以同时预订该项目。这种syncronisation有时会消失,并且比'numberOf'字段变量更多的行,反之亦然。将数据库值与另一个表中的行数进行比较

所以我想显示一个表,输出第一个表中的'numberOf',以及从另一个表中对应的行数。它们通过项目ID链接。希望这不是太混乱。查询以do while循环输出。以下是我至今仍在查询的内容:

$querySync = sprintf("SELECT 
          COUNT(reserve_id), item_id, details, numberOf 
         FROM 
          reservations  
         JOIN 
          items ON item_id = itemID_reserved      
         WHERE 
          itemID_reserved = 1 "); 

所以目前它计算保留表中的行数。然后它加入物品表,所以我可以显示说明和numberOf等。当然,目前它只输出ID为1的物品。但我似乎无法让它通过每个物品,检查其编号,并且将其与预订表中的行数进行比较。

这个想法是把它全部放在一个列上,如果它不同步等行打印结束,我需要重建预订表中的行以匹配numberOf。

对不起,这是一个很长的!

+0

你为什么要存储计算值?由于计算该值所需的数据已经存储在数据库中,因此实际上可以将事物标准化。对于汇总表来说这可能是可以接受的,但通常不被认为是好的做法。 – dnagirl 2009-09-25 15:12:03

+0

dnagirl提供了一个绝佳的观点 - 这是您尝试存储汇总值时创建的问题。 – TML 2009-09-25 15:14:28

+0

我认为'numberOf'是可能的最大保留数量,而不是实际的数量,这就是'@ op'想要比较的。 – Quassnoi 2009-09-25 15:14:46

回答

1
SELECT COUNT(reserve_id), item_id, details, numberOf, 
     COUNT(reserve_id) > numberOf AS overbook 
FROM items 
LEFT JOIN 
     reservations 
ON  itemID_reserved = item_id 
GROUP BY 
     item_id 
0

可能更容易只是直接计算出哪些项目是“不同步”:

select i.item_id 
from reservations r JOIN items i on (i.item_id = r.itemID_reserved) 
group by i.item_id 
having count(r.itemID_reserved) > i.numberOf 

我正在做一些假设有哪些表有哪些字段,但它应该是足够说明。