嘿所有,我正在努力弄清楚如何解决我需要的这个问题。
我只需要显示用户在其帐户中拥有的公司,并且只显示该公司当天的日历。
我的userinfo数据库就是这个(只显示所需的表格信息):
ID | UserID | idNumber | theAccount
----------------------------------------
2 | 5556120012 | NA | MAIN
6 | 5556120012 | 5680012 | SUB
公司数据库是这样的(仅显示所需的表格信息):
ID | idNumber | theDateStart | theDateEnd
-------------------------------------------
2 | 5680012 | 2010-06-02 | 2010-06-03
6 | 56057477 | 2010-06-01 | 2010-06-03
我现在所拥有的SQL查询可以很好地选择每个公司今天的日期。
SELECT clientinfo.id, clientinfo.theCompName, clientinfo.theURL,
clientinfo.picURL, clientinfo.theOwnerFN, clientinfo.theOwnerLN,
clientinfo.storeNum, clientinfo.compAddress, clientinfo.compAddressC,
clientinfo.compAddressS, clientinfo.compAddressZ, clientinfo.accountStats,
clientinfo.idNumber, IFNULL(clientoffers.idNumber, 'NA'),
IFNULL(clientoffers.theDateStart, 'NA'), IFNULL(clientoffers.theDateEnd, 'NA')
FROM clientinfo
LEFT JOIN clientoffers ON (clientinfo.idNumber = clientoffers.idNumber AND '2010-06-03'
BETWEEN clientoffers.theDateStart AND clientoffers.theDateEnd), userinfo
WHERE clientinfo.accountStats = 'OPEN'
AND IFNULL(clientoffers.idNumber, 'NA') <> "NA"
GROUP BY clientinfo.idNumber
ORDER BY clientinfo.theCompName ASC
这表明每个公司的日历上都有当前的东西。问题出现的地方是我不知道在该查询中添加userinfo的位置以确保用户在其帐户中有公司(为了查看日历上的内容,用户必须将公司添加到他们的帐户中帐户)。
因此,如上所示,用户的帐户中只有公司5680012,因此,只需要在查询中显示该公司。如果他们有多个,那么它应该显示那么多。
在userinfo数据库中,“idNumber”列是每个公司的ID号。因此,在上面的示例中,该用户帐户中只有一家公司(第一家只是与任何公司无关的一般“MAIN”帐户。)
正如你所看到的,这是一个非常难的问题(至少对我而言)所以我希望有人可以帮助我解决它!
大卫
答案 0 :(得分:0)
据我所知,userinfo和公司之间只有单向关系。从您提供的表格中无法检查日期是否对用户是唯一的,或者是否与多个人对应。这是故意还是设计缺陷?
答案 1 :(得分:0)
我看到你正在使用GROUP BY
,没有任何聚合函数。结果集中的大多数列未在group by子句中提及,并且根据mysql文档,为这些列返回的值是不确定的(http://dev.mysql.com/doc/refman/5.1/en/group-by-hidden-columns.html)。
无论如何,如果结果是你需要的,那没关系。
我已经通过在where子句中添加“and userinfo.idNumber = clientinfo.idNumber”来完成了对userinfo表的连接。如果我正确理解你的数据库方案,它应该这样做。
SELECT clientinfo.id, clientinfo.theCompName, clientinfo.theURL,
clientinfo.picURL, clientinfo.theOwnerFN, clientinfo.theOwnerLN,
clientinfo.storeNum, clientinfo.compAddress, clientinfo.compAddressC,
clientinfo.compAddressS, clientinfo.compAddressZ, clientinfo.accountStats,
clientinfo.idNumber, IFNULL(clientoffers.idNumber, 'NA'),
IFNULL(clientoffers.theDateStart, 'NA'), IFNULL(clientoffers.theDateEnd, 'NA')
FROM clientinfo
LEFT JOIN clientoffers ON (clientinfo.idNumber = clientoffers.idNumber AND '2010-06-03'
BETWEEN clientoffers.theDateStart AND clientoffers.theDateEnd), userinfo
WHERE clientinfo.accountStats = 'OPEN'
and userinfo.idNumber = clientinfo.idNumber
AND IFNULL(clientoffers.idNumber, 'NA') <> "NA"
GROUP BY clientinfo.idNumber
ORDER BY clientinfo.theCompName ASC