更新:在底部添加架构......
我有一份合约表:tbl_contract
与合同相关联的用户表:tbl_contract2user
tbl_contract2user
中可以有任意数量的条目,其中现有条目表示该关系存在(以及pending
列1 = pending
和0 = 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
答案 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行......