MySQL объединил результат из двух таблиц - PullRequest
0 голосов
/ 27 августа 2018

это моя ситуация:

У меня есть две таблицы 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

Я хочу выбрать все subject_a и subject_b со значением (например, JOHN) и объединить их в одну таблицу со столбцами:

| 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_a = subject_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 tab_order и 1 и использовал псевдонимы, чтобы он был более читабельным. Для заказа можно использовать один из столбцов при первом выборе, а для добавления дополнительных условий просто используйте AND или, если вам не нужен NULL, мы можем использовать 0,00 AS вместо NULL AS в обоих выборках.

Еще раз спасибо scaisEdge за помощь и терпение.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы можете просто присоединиться к столам.

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

Это объединит оба набора данных в одну таблицу результатов. Конечно, если вы не хотите дублировать значения (т.е. id_doc_a и id_doc_b), вы можете указать, какие из них вы хотите, вместо подстановочного знака *

0 голосов
/ 27 августа 2018

вы можете использовать UNION ALL

   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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...