это моя ситуация:
У меня есть две таблицы 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 за помощь и терпение.