MySQL与何处联盟

MySQL与何处联盟,mysql,union,Mysql,Union,我有以下两张桌子 表a(id、姓名、姓氏、计划、日期) 表b(id、aid、姓名、姓氏、外卡) 表A.id=表B.aid(1对n关系) 在结果中,tableB的每个成员都应该具有tableA中的所有值(程序、日期、过期日期等),并且在同一列中只显示tableB中的姓名(coalesce??)。此外,我还需要为介于(%id1和%id2)之间的a.id使用一个between子句,并使用WHERE语句来选择tableB.card=1的行 | a.ID | NAME | SURNAME | PROGR

我有以下两张桌子 表a(id、姓名、姓氏、计划、日期) 表b(id、aid、姓名、姓氏、外卡) 表A.id=表B.aid(1对n关系)

在结果中,tableB的每个成员都应该具有tableA中的所有值(程序、日期、过期日期等),并且在同一列中只显示tableB中的姓名(coalesce??)。此外,我还需要为介于(%id1和%id2)之间的a.id使用一个between子句,并使用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 |
编辑: 请参阅您正在寻找的-

(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

您可以根据需要选择
left/internal join
,也可以使用
between
子句来选择
where
条件<代码>其中id介于2和8之间或
其中id>2和id<8

谢谢,但这是一个简单的连接,在单独的列中返回名称、姓氏,我需要它们在同一列中。编辑答案。这应该是你要找的。请注意,程序、日期和过期日期显示在所有结果中,尽管它们只能在表A中找到。我想我们需要在其中的某个地方合并,但我不太确定。这意味着你不想使用联合?更改为UNION而不是UNION ALL。这是您想要的结果吗?TableB没有date、expires列,这些列仅在TableA中,但也应该出现在TableB的行中。(合并?)是的,tableb与tablea有一个联接,因此这些行的列值将根据联接从tablea中携带。
 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
(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
(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 ...);