2010-06-03 32 views
-1

嘿,所有的,我遇到了一個大問題,試圖找出如何去關於這個查詢我需要。硬mySQL查詢問題

我只需要顯示用戶在其帳戶中的公司,並且只顯示公司,如果他們在當天的日曆上。

我的用戶信息數據庫是這樣(只顯示需要的表信息):

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 

這表明所有在每個公司的日曆上都有當前事物。問題出現的地方是我不知道該查詢中添加用戶信息的位置,以確保用戶在其賬戶中有一家公司(爲了查看日曆中的內容,用戶必須將公司添加到他們的賬戶中帳戶)。

因此,如上例所示,用戶只在其賬戶中擁有公司5680012,因此只有該公司需要在查詢中顯示。如果他們有不止一個,那麼它應該顯示那麼多。

在userinfo db上,「idNumber」列是每個公司的id號。因此,在上面的示例中,該用戶帳戶中只有一家公司(第一個公司只是一個與任何公司無關的通用「主要」帳戶。)

正如您所看到的,這是一個相當困難的查詢至少對我來說),所以我希望有人能幫助我!

大衛

回答

0

從我所看到的,只有用戶信息和公司之間的單向關係。從您提供的表格無法檢查日期對用戶是唯一的還是與多個人相對應。這是故意還是設計缺陷?

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