mysql组合结果

ryhaxcpt  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(358)

这是我的情况:
我有两个表a和b,想把a和b的结果合并起来。也许用词解释起来很复杂,但用表格结果来说明更容易理解。
表a的代码

CREATE TABLE `A` (
  `id_doc_a` int(11) NOT NULL AUTO_INCREMENT,
  `subject_a` varchar(100) DEFAULT NULL,
  `doc_nr_a` varchar(100) NOT NULL,
  `doc_type_a` varchar(50) NOT NULL,
  `doc_date_a` date NOT NULL,
  `value_IN` varchar(50) NOT NULL,
  PRIMARY KEY (`id_doc_a`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

表b的代码

CREATE TABLE `B` (
  `id_doc_b` int(11) NOT NULL AUTO_INCREMENT,
  `subject_b` varchar(100) DEFAULT NULL,
  `doc_nr_b` varchar(100) NOT NULL,
  `doc_type_b` varchar(50) NOT NULL,
  `doc_date_b` date NOT NULL,
  `value_OUT` varchar(50) NOT NULL,
  PRIMARY KEY (`id_doc_b`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

我想选择所有具有值(例如john)的subjects\u a和subjects\u b,并将它们合并到一个具有列的表中:

| SUBJECT | DOC_NR | DOC_TYPE | DOC_DATE    | TBL_A_VALUE_IN | TBL_B_VALUE_OUT |
|---------|--------|----------|-------------|----------------|-----------------|
| JOHN    | 1      | PDF      | 20018-03-16 | 50.00          | NULL OR 0.00    |
| JOHN    | 33     | PDF      | 20018-08-09 | 25.00          | NULL OR 0.00    |
| JOHN    | 13     | PDF      | 20018-07-29 | 32.50          | NULL OR 0.00    |
| JOHN    | 4      | PDF      | 20018-06-06 | 41.30          | NULL OR 0.00    |
| JOHN    | 12     | JPEG     | 20018-04-22 | NULL OR 0.00   | 78.20           |
| JOHN    | 31     | JPEG     | 20018-03-21 | NULL OR 0.00   | 6.50            |
| JOHN    | 33     | JPEG     | 20018-05-01 | NULL OR 0.00   | 26.99           |

其中,前4行是表a的结果,后3行是表b的结果,其中条件是subject(subject\u a=subject\u b)=john。
希望解释得好,谢谢你的帮助。
解决方案:感谢@scaisedge

SELECT 
     t.SUBJECT_NAME, 
     t.DOCUMENT_NR, 
     t.DOCUMENT_TYPE, 
     t.DOCUMENT_DATE, 
     t.TBL_A_VALUE_IN, 
     t.TBL_B_VALUE_OUT
FROM (
     SELECT 
           SUBJECT_a AS SUBJECT_NAME, 
           DOC_NR_a AS DOCUMENT_NR, 
           DOC_TYPE_a AS DOCUMENT_TYPE, 
           DOC_DATE_a AS DOCUMENT_DATE,
           VALUE_IN AS TBL_A_VALUE_IN, 
           NULL AS TBL_B_VALUE_OUT
     FROM a 
  UNION ALL
     SELECT  
           SUBJECT_b AS SUBJECT_NAME, 
           DOC_NR_b AS DOCUMENT_NR, 
           DOC_TYPE_b AS DOCUMENT_TYPE, 
           DOC_DATE_b AS DOCUMENT_DATE,
           NULL AS TBL_A_VALUE_IN,
           VALUE_OUT AS TBL_B_VALUE_OUT
     FROM b
) T 
  WHERE t.SUBJECT_NAME = 'john'
  ORDER BY t.DOCUMENT_DATE

我删除了0和1,并使用了别名,这样它更可读。对于order可以使用第一个select上的一列,如果要添加更多条件,只需使用,或者如果不需要null,我们可以使用0.00,而不是null作为两个select。
再次感谢斯凯西奇的帮助和耐心。

2guxujil

2guxujil1#

你完全可以用工会

select   t.SUBJECT, t.DOC_NR, t.DOC_TYPE, t.DOC_DATE 
       , t.TBL_B_VALUE_IN,t.TBL_B_VALUE_OUT
    from (

    select   SUBJECT_a subject, DOC_NR_a DOC_NR, DOC_TYPE_a DOC_TYPE, DOC_DATE_a  DOC_DATE
         , VALUE_IN TBL_B_VALUE_IN, null TBL_B_VALUE_OUT , 0 tab_order 
    from table_a 
    union all
    select   SUBJECT_b, DOC_NR_b, DOC_TYPE_b, DOC_DATE_b , null,VALUE_OUT , 1  
    from table_b
    ) T 
    order by t.tab_order
k3bvogb1

k3bvogb12#

你只需要加入表格。

SELECT *
FROM A
    JOIN B on A.subject_a = B.subject_b
WHERE A.subject_a = 'JOHN'

将两个数据集合并到一个结果表中。当然,如果不需要重复的值(即id\u doc\u a和id\u doc\u b),可以指定所需的值,而不是通配符*

相关问题