2014-11-21 105 views
-2

我有3個表我想從中獲取信息。選擇與內部連接的數據

tblStaff

ID |命名

tblWork

用戶ID |本週

tblOff

用戶ID |周

例如,如果邁克爾在week列的任何一個tblWorktblOff列有值或多個值,那麼我希望返回這些值。

UPDATE

這一個作品幾乎我想要的。除此之外,如果tblOfftblWork看起來是這樣的:

邁克爾=用戶標識1

丹=用戶標識2

tblWork

用戶ID,周

1 | 2014 v47

1 | 2014 v50

2 | 2014 V48

tblOff

用戶ID,周

1 | 2014 v48

1 | 2014 v49

2 | 2014 v52

然後我只得到邁克爾這兩個表中的第一個結果,我沒有得到兩個week值。

SELECT tblStaff.name as name, tblWork.week as work_week, tblOff.week as off_week 
         FROM tblStaff 
         LEFT JOIN tblWork 
         ON tblStaff.id = tblWork.userid 
         LEFT JOIN tblOff 
         ON tblStaff.id = tblOff.userid 
         GROUP BY tblStaff.name 

SLOVED

這就是我所做的。之後我使用爆炸()來分隔值,將其檢查本年度+周

SELECT tblStaff.name as name, GROUP_CONCAT(DISTINCT tblWork.week) as work_week, GROUP_CONCAT(DISTINCT tblOff.week) as off_week 
         FROM tblStaff 
         LEFT JOIN tblWork 
          ON tblStaff.id = tblWork.userid 
         LEFT JOIN tblOff 
          ON tblStaff.id = tblOff.userid 
         GROUP BY tblStaff.name 
         ORDER BY tblStaff.name ASC 
+0

你能提供一個你想看到什麼和你的表是什麼樣子的樣本? – 2014-11-21 21:07:03

+0

我更新了問題。現在,它沒有列出任何東西。沒有錯誤,所以我一定在問錯誤的問題。 – MrUnknown 2014-11-21 21:13:40

+0

你有兩個選擇,我可以想到在我的頭頂查詢。您可以對concat進行分組,它將組合所有列中的條目,按您選擇的內容(例如,如果需要的話,將HTML代碼塊分隔)返回爲特定分組值的一列(例如名稱以獲取所有條目一個名字的值)。或者你可以使查詢更加複雜。 – 2014-11-21 21:19:14

回答

0

如果您tblWork.week列包含像2014 v47值那麼

SELECT tblStaff.name as name, 
     GROUP_CONCAT(DISTINCT tblWork.week ORDER BY tblWork.week) as work_week 
etc 

結果會是這樣的。

name  work_week 
Michael 2014 v47,2014 v48,2014 v50,2014 v51 
George  2014 v49,2014 v50,2014 v51 

GROUP_CONCAT創建與它逗號分隔的值的字符串。

如果你想

name  work_week 
Michael 2014 v47 | 2014 v48 | 2014 v50 | 2014 v51 

你需要

SELECT tblStaff.name as name, 
     GROUP_CONCAT(DISTINCT tblWork.week ORDER BY tblWork.week SEPARATOR ' | ') as work_week 

你的php程序似乎並沒有被期待的那種文本字符串GROUP_CONCAT()產生。

要獲得每人姓名的一行以及工作周和周的列,您將需要這樣的嵌套查詢。

SELECT a.name, b.weeks as work_week, c.weeks as off_week 
    FROM tblStaff a 
    LEFT JOIN (
       SELECT userid, 
        GROUP_CONCAT(DISTINCT week 
            ORDER BY week 
            SEPARATOR ' | ') as weeks 
       FROM tblWork 
       GROUP BY userid    
      ) b ON a.id = b.userid 
    LEFT JOIN (
       SELECT userid, 
        GROUP_CONCAT(DISTINCT week 
            ORDER BY week 
            SEPARATOR ' | ') as weeks 
       FROM tblOff 
       GROUP BY userid    
      ) c ON a.id = c.userid 

這是一個SQL小提琴顯示此。 http://sqlfiddle.com/#!2/f63e0/1/0

您需要分別在tblWorktblOff上執行GROUP BY操作。如果你加入他們,然後做GROUP BY,你會得到一個組合爆炸,這是不好的。

+0

謝謝奧利的幫助!我嘗試過,但是我無法完成它,然後我試圖重寫它,而且我幾乎沒有錯,但並不是那樣。我用我的嘗試更新了這個問題。 – MrUnknown 2014-11-21 23:10:36

+0

哎呀,對不起,我應該知道比編寫一個複雜的查詢更好,而不用嘗試它。我編輯過它。在這裏,工作。 http://sqlfiddle.com/#!2/f63e0/1/0 – 2014-11-21 23:35:51

+0

非常感謝了Ollie!我沒有使用完整的代碼,因爲我在寫完另外一個代碼後看到了你的迴應,但是你把我推向了正確的方向,非常感謝! – MrUnknown 2014-11-21 23:58:08