2012-07-10 63 views
0

我有以下2個表 tableA的(ID,姓名,程序,日期) tableB的B(ID,助劑,名,姓,extracard) 與tableA.id = tableB.aid (1到n的關係)的MySQL UNION與WHERE

Sample data for tableA: 
| ID | NAME | SURNAME | PROGRAM | DATE | EXPIRES | 
---------------------------------------------------------- 
| 1 | TOM | JONES | 1,2,3 | 12/8/2012 | 12/8/2013 | 
| 2 | JAMIE | OLIVER | 4,5,6 | 15/8/2012 | 15/8/2013 | 

Sample data for tableB: 
| ID | AID | NAME | SURNAME | CARD | 
------------------------------------- 
| 1 | 1 | ANNE | JONES | 1 | 
| 2 | 1 | JACK | BOWER | 0 | 
| 3 | 2 | KATE | PERRY | 1 | 
| 4 | 2 | JOHN | DOE  | 0 | 
| 5 | 2 | HARRY | POTTER | 0 | 

在結果中,tableB的每個成員應該具有從表A和只顯示名字,姓氏的所有值(程序,日期,過期等)從tableB的在同一列(合併??)。另外,我需要子句之間使用的(%ID1和ID2%)之間a.id,也是一個WHERE語句中選擇其中tableB.card = 1

| a.ID | NAME | SURNAME | PROGRAM | DATE | EXPIRES | 
------------------------------------------------------------ 
| 1 | TOM | JONES | 1,2,3 | 12/8/2012 | 12/8/2013 | 
| 1 | ANNE | JONES | 1,2,3 | 12/8/2012 | 12/8/2013 | 
| 2 | JAMIE | OLIVER | 4,5,6 | 15/8/2012 | 15/8/2013 | 
| 2 | KATE | PERRY | 4,5,6 | 15/8/2012 | 15/8/2013 | 

回答

1
SELECT * FROM 
    ((SELECT a.id ,a.name,a.surname,a.program,a.date,a.expires 
    from tableA a left outer join tableB b 
    on b.aid=a.id 
    where b.card=1 and (a.id between '1' and '2')) 
    UNION ALL 
    (SELECT a.id ,b.name,b.surname,a.program,a.date,a.expires 
    from tableA a left outer join tableB b 
    on b.aid=a.id 
    where b.card=1 and (a.id between '1' and '2'))) t 
    ORDER BY id 

EDITED行: 請參閱到http://sqlfiddle.com/#!2/d8227/1

+0

謝謝,但這是一個簡單的連接,返回名稱,姓在不同的列,我需要他們在同一列。 – bikey77 2012-07-10 08:15:55

+0

編輯答案。這應該是你在找什麼。 – sel 2012-07-10 08:29:01

+0

請注意,程序,日期和截止日期都顯示在所有結果中,但它們只能在tableA中找到。我認爲我們需要在那裏的聯盟,但我不太確定。 – bikey77 2012-07-10 08:39:43

0

您是否在尋找 -

(SELECT a.id, name, surname, program, date, expires FROM tableA a WHERE a.id BETWEEN '%id1' and '%id2') 
UNION 
(SELECT a.id, b.name, b.surname, program, date, expires FROM tableB b LEFT JOIN tableA a ON b.aid=a.id WHERE b.card=1 AND (a.id between '%id1' and '%id2')) 
ORDER BY a.id ASC 
0
(select a.ID,a.NAME,a.SURNAME,a.PROGRAM,a.DATE,a.EXPIRES from tableA a where ...)  
Union All  
(select a2.ID,b.NAME,b.SURNAME,a2.PROGRAM,a2.DATE,a2.EXPIRES from tableB b 
left join tableA a2 on b.aid = a2.id where ...); 

您可以選擇left/inner join根據您的需要和where條件也between條款喜歡.. where id between 2 and 8where id > 2 and id < 8

+0

TableB沒有列日期,過期,這些只在TableA中出現,但也應該出現在TableB的行中。 (合併?) – bikey77 2012-07-10 08:25:52

+0

是的,tableb與tablea有一個連接,所以這些行的列值將根據連接以tablea形式進行。 – manurajhada 2012-07-10 08:52:27