2010-05-20 80 views
3

我有3個表, 'U' 'D' 'S'PHP SQL,一次從3個表中選擇相應的數據?

'U' 具有

  • 的userid
  • DIVID

'd' 具有

  • divid
  • divname

's' 有

  • SNAME
  • primaryuserid
  • secondaryuserid

現在我想要做的是顯示錶具有以下格式的行

  • 用戶ID,divname,SNAME

加想出一個辦法破譯的userid是否是伯或仲此SNAME表。

我能夠使用左連接顯示userid和divname,但我不知道如何添加第三個表格?爲了使它更棘手,每個用戶ID可以有多於一個的sname,高達20。有沒有辦法根據用戶ID顯示0-20個名稱,用逗號分隔?

我目前所擁有的只是與你對應的u和d表格。

SELECT 
    e.userid, 
    e.divid, 
    d.divname 
FROM 
    e 
LEFT JOIN d ON (e.divid = d.id) 
ORDER BY e.userid 
+0

多一點解釋你的表格如何相互關聯會有所幫助。例如,你可以給我們你已經使用的左連接嗎? – Chris 2010-05-20 17:13:06

+0

SELECT e.userid, d.divname FROM Ë LEFT JOIN D ON(e.divid = d.divid) ORDER BY e.userid 很抱歉的缺乏編輯的,我不能t在評論框中對其進行格式化 – Flarex 2010-05-20 17:30:35

回答

2

您正在尋找一些不同的東西在這裏。首先,可以使用MySQL的GROUP_CONCAT()函數完成「根據用戶ID顯示0-20個名稱的方式,用逗號分隔」的方式,因此您的查詢看起來像這樣(主要和次要之間沒有區別):

SELECT u.userid, 
    d.divname, 
    GROUP_CONCAT(s.sname SEPARATOR ', ') AS "snames" 
FROM u 
    LEFT JOIN d ON d.divid = u.divid 
    LEFT JOIN s ON (s.primaryuserid = u.userid OR s.secondaryuserid = u.userid); 

現在,爲了能夠區分用戶是主用戶還是次用戶,您必須獲得更多的信息。我大概有工會做,像這樣:

SELECT u.userid, 
    d.divname, 
    GROUP_CONCAT(s.sname SEPARATOR ', ') AS "snames", 
    'Primary' AS "category" 
FROM u 
    LEFT JOIN d ON d.divid = u.divid 
    LEFT JOIN s ON s.primaryuserid = u.userid 
UNION ALL 
SELECT u.userid, 
    d.divname, 
    GROUP_CONCAT(s.sname SEPARATOR ', ') AS "snames", 
    'Secondary' AS "category" 
FROM u 
    LEFT JOIN d ON d.divid = u.divid 
    LEFT JOIN s ON s.secondaryuserid = u.userid 

這會給你兩行(一個小學,一箇中學),用於與snames的逗號分隔列出了每個用戶ID。

1

你可以加入的桌子,和s兩次兩種可能的關係:

select 
    u.userid 
, d.divname 
, coalesce(s1.sname, s2.sname) 
, case when s1.sname is not null then 'Primary' 
     when s2.sname is not null then 'Secondary' 
     else 'None' end 
from u 
join d on d.divid = u.divid 
left join s s1 on s1.primaryuserid = u.userid 
left join s s2 on s2.secondaryuserid = u.userid 

顯示最多用逗號分隔開20名的用戶名在客戶端最好做在PHP。可以在數據庫中完成,但方法取決於您的DBMS。對於MySQL,將子查詢限制爲20行非常困難,但創建逗號分隔列表非常簡單。例如:

select 
    group_concat(coalesce(s1.sname,s2.sname) separator ',') 
, ... 
from u 
... 
group by u.userid 
+0

我在第四行的isnull調用中遇到了問題。 MySQL給我的錯誤,並在網上查找它看起來像它只能採取1參數。 我想我可能沒有足夠清楚地說明我的問題,關於's'和sname。 sname永遠不會爲空,但是,它可能沒有任何用戶標識附加到它。它可以有多達2個主要和次要用戶標識。 – Flarex 2010-05-20 17:25:45

+0

@ user346325:對於MySQL,「isnull」應該是「coalesce」。它檢查null,因爲如果左連接到's1'沒有找到任何東西,它會將所有's1'字段設置爲空 – Andomar 2010-05-20 17:29:20

+0

我還沒有嘗試過group_concat,但它看起來很簡單。感謝coalesce方法。與我正在嘗試做的事情相比,它簡化了代碼! – Flarex 2010-05-20 17:43:58

0

創建一個Inner Join並將其放入視圖中。然後,我們可以在視圖上進行選擇。

相關問題