硬mySQL查询问题

时间:2010-06-03 21:26:22

标签: mysql

嘿所有,我正在努力弄清楚如何解决我需要的这个问题。

我只需要显示用户在其帐户中拥有的公司,并且只显示该公司当天的日历。

我的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”帐户。)

正如你所看到的,这是一个非常难的问题(至少对我而言)所以我希望有人可以帮助我解决它!

大卫

2 个答案:

答案 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