2014-11-19 2 views
1

Я бил головой о кирпичную стену, пытаясь заставить это работать, и я не знаю, почему это не так.MySQL, соединяющий таблицы, дает неожиданный результат

Я присоединяюсь к таблицам A и B, используя my_field. Затем я запускаю дополнительный запрос, чтобы получить my_field из таблицы B , где complete = 1. Это то, что я хочу использовать для запроса таблицы C и D

Это мой текущий запрос

SELECT 
    table_A.*, 
    table_B.*, 
    table_C.*, 
    table_D.* 
FROM table_A 
    INNER JOIN table_B ON 
     table_A.my_field = table_B.my_field 
    LEFT JOIN (SELECT my_field FROM table_B WHERE complete ='1') test ON 
     table_B.my_field = test.my_field 
    RIGHT JOIN table_C ON 
     test.my_field = table_C.my_field 
    INNER JOIN table_D ON 
     table_C.my_field = table_D.my_field 

Это выход из текущего запроса

table_A.field1 | table_A.field2 | table_B.field1 | table_B.field2 | table_C.field1 | table_C.field2 | table_D.field1 | table_D.field2 | test.complete 
============================================================================================================================================================================= 
something  | something  | something  | something  | something  | something  | something  | something  |  1 
    null  |  null  |  null  |  null  | something  | something  | something  | something  |  0 

и это то, что я хочу чтобы получить

table_A.field1 | table_A.field2 | table_B.field1 | table_B.field2 | table_C.field1 | table_C.field2 | table_D.field1 | table_D.field2 | test.complete 
============================================================================================================================================================================= 
something  | something  | something  | something  | something  | something  | something  | something  |  1 
something  | something  | something  | something  | null   | null   | null   |  null  |  0 

UPDATE:

Вот структуры таблиц. Я удалил столбцы, которые не привязаны к какой-либо другой таблице.

CREATE TABLE IF NOT EXISTS `table_A` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `code` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `code` (`code`) 
); 

CREATE TABLE IF NOT EXISTS `table_B` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `code` varchar(255) NOT NULL, 
    `complete` enum('0','1') NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE IF NOT EXISTS `table_C` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `code` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `code` (`code`) 
); 

CREATE TABLE IF NOT EXISTS `table_D` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `code` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
); 
+1

'Левый Join' и' правой Join' в том же запросе болит голова ... – Siyual

+1

Я почти уверен, если вы используете запоминающиеся соглашения об именах вещей, было бы лучше .. почему бы не использовать фрукты и продукты или автомобили или что-то еще. generic names tire me – Coffee

+0

, что точка этого кода? :: 'LEFT JOIN (SELECT my_field FROM table_B WHERE complete = '1') test ON table_B.my_field = test.my_field' -> почему вы делаете все это – Coffee

ответ

1

Почему вы не избавляетесь от левого присоединения? Это облегчает чтение.

SELECT 
    table_A.*, 
    table_B.*, 
    table_C.*, 
    table_D.* 
FROM table_A 
    INNER JOIN table_B ON 
    table_A.my_field = table_B.my_field 
    LEFT JOIN table_C ON 
    table_B.my_field = table_C.my_field and table_B.complete ='1' 
    LEFT JOIN table_D ON 
    table_C.my_field = table_D.my_field 
+1

В противном случае, если вам нужно внутреннее соединение между C и D, поместите их в подзапрос и RIGHT- Присоединяйтесь к суб-запросу. – Lukos

+0

Я все еще получаю тот же результат – AdRock

+0

@AdRock Я еще раз посмотрел на ваш пример. используя правильное соединение, вы получите строки с нулевыми значениями в столбцах table_A, если вы не хотите нулей, не используйте правильный синтаксис соединения. – bowlturner

Смежные вопросы