一个MySQL查询,一些规范化的表,从规范化的表行(来自PHP)发出计数

时间:2011-10-28 23:17:16

标签: php mysql

更新:在底部添加架构......

我有一份合约表:tbl_contract

与合同相关联的用户表:tbl_contract2user

tbl_contract2user中可以有任意数量的条目,其中现有条目表示该关系存在(以及pending1 = pending0 = approved

我的目标是在指定的时间范围内选择所有有1个(或更多)活跃用户的合同(见下文)。

我遇到的问题是能够正确理清这些合同。日期范围工作正常......出于某种原因,我无法理解用户数量是1还是更多...(对比0)和是 - 我将使用该数据集(之后)查询)。

请参阅下面的查询开头......

$result = mysql_query("SELECT tbl_contract.id 
    FROM        tbl_contract
    LEFT JOIN   tbl_contract2user ON tbl_contract.id = tbl_contract2user.contractID
    WHERE       tbl_contract2user.pending = 0
    AND         tbl_contract.startDate <= {$billing['start_time']}
    AND         tbl_contract.endDate    >= {$billing['end_time']}");

架构:

tbl_contract:id, startDate, endDate, value, name, dateCreated

tbl_contract2user:id, contractID, userID, pending

1 个答案:

答案 0 :(得分:2)

实际问题是什么? 您是否获得所有记录而不是仅包含相关用户的记录?如果是,请将LEFT JOIN变为INNER JOIN,所有没有关系的合同都将消失......

  

真正的问题是,如果我在一个合同中有6个用户,我会得到6行   该合同返回而不是一行

这正是JOIN的作用。它从左侧获取所有记录,并使用特定条件将它们与右侧的记录连接起来。如果您只想知道合同有多少用户,您可以使用GROUP BY子句和COUNT(*):

SELECT      tbl_contract.id, COUNT(*) AS userCount
FROM        tbl_contract
LEFT JOIN   tbl_contract2user ON tbl_contract.id = tbl_contract2user.contractID
WHERE       tbl_contract2user.pending = 0
AND         tbl_contract.startDate <= {$billing['start_time']}
AND         tbl_contract.endDate    >= {$billing['end_time']}
GROUP BY    tbl_contract.id

如果您需要有关该用户的更多信息,您确实需要所有这6行......