2012-06-14 125 views
0

所以我有2個表(以下簡化)加入表上的不同行多次在一個結果集

members      documents 
------------    ------------------ 
id | name | registered  id | member_id | type | expiry 
----------------------  ------------------------------ 
1 | AAA | 1234567890  1 | 1   | 1 | 1234567890 
2 | BBB | 1234567890  2 | 1   | 2 | 1234567891 
3 | CCC | 1234567890  3 | 1   | 3 | 1234567892 
          4 | 2   | 1 | 1234567893 
          5 | 2   | 2 | 1234567894 
          6 | 2   | 3 | 1234567890 

,我需要這樣的顯示這些:

member id | name | doc 1 expiry | doc 2 expiry | doc 3 expiry 
-------------------------------------------------------------- 
1   | AAA | 1234567890 | 1234567891 | 1234567892 
2   | BBB | 1234567893 | 1234567894 | 1234567895 

我我試過用多個外連接和別名來查詢,但它只是重複文檔到期時間戳。這是我到目前爲止有:

SELECT DISTINCT `members`.`id`, `members`.`name`, `a`.`expiry` AS `expiry1`, `b`.`expiry` AS `expiry2`, `c`.`expiry` AS `expiry3` 
    FROM `members` 
    LEFT OUTER JOIN `documents` a ON `a`.`member_id` = `members`.`id` 
    LEFT OUTER JOIN `documents` b ON `b`.`member_id` = `members`.`id` 
    LEFT OUTER JOIN `documents` c ON `c`.`member_id` = `members`.`id` 
    GROUP BY `members`.`id` 

人們需要能夠通過這個搜索,例如列表中的所有人,其文件類型3已過期。

回答

0

嘗試

SELECT 
    a.id AS 'member id', 
    a.name 
    SUM(a.d1exp) AS 'doc 1 expiry', 
    SUM(a.d2exp) AS 'doc 2 expiry', 
    SUM(a.d3exp) AS 'doc 3 expiry' 
FROM 
    (
     SELECT 
      aa.id, 
      aa.name, 
      COALESCE(d1.expiry, 0) AS d1exp, 
      COALESCE(d2.expiry, 0) AS d2exp, 
      COALESCE(d3.expiry, 0) AS d3exp 
     FROM 
      members aa 
     LEFT JOIN 
      documents d1 ON aa.id = d1.member_id AND d1.type = 1 
     LEFT JOIN 
      documents d2 ON aa.id = d2.member_id AND d2.type = 2 
     LEFT JOIN 
      documents d3 ON aa.id = d3.member_id AND d3.type = 3 
    ) a 
GROUP BY 
    a.id, 
    a.name 

這假設在「期滿」字段中的值是數值。

+0

謝謝!我不知道那裏發生了什麼,所以我要讀這個,但它已經成功了! –