2013-10-04 2 views
0

Я ищу, чтобы выполнить запрос, который будет возвращать данные из нескольких таблиц в mySQL, которые потребуют некоторых подзапросов, однако я не уверен, что то, что я пытаюсь достичь, возможно даже в один проход.mySQL Subquery - Одиночный проход, если возможно

У меня есть ниже в качестве примера (я знаю, что это не работает, но дает представление)

SELECT field_id, field_1, 
    (SELECT subfield_1 FROM tableb WHERE subfield_id = field_3) AS field_a, 
    (SELECT subfield_1 FROM tableb WHERE subfield_id = field_4) as field_b 
FROM tablea WHERE field_2 = 123 

Это потянет 2 записи из второй таблицы на основе 2-х различных столбцов в главной таблице ,

tablea 
---------- 
field_id, bigint 
field_1, varchar(50) 
field_2, int 
field_3, bigint 
field_4, bigint 

tableb 
---------- 
subfield_id, bigint 
subfield_1, varchar(50) 

ответ

0

использования JOIN с. В зависимости от того, field_3 и field_4 являются NULL могут или не использовать либо LEFT JOIN (как в примере ниже) или INNER JOIN

SELECT field_id, field_1, b1.subfield_1 field_a, b2.subfield_1 field_b 
    FROM tablea a LEFT JOIN tableb b1 
    ON a.field_3 = b1.subfield_id LEFT JOIN tableb b2 
    ON a.field_4 = b2.subfield_id 
WHERE a.field_2 = 123 

Пример вывода:

 
| FIELD_ID | FIELD_1 | FIELD_A | FIELD_B | 
|----------|---------|-----------|-----------| 
|  1 |  11 | subvalue1 | subvalue5 | 
|  2 |  22 | subvalue4 | subvalue2 | 
|  3 |  33 | subvalue2 | (null) |  

Примечание: Убедитесь, что у вас есть индексы на field_3 и field_4

SQLFiddle демо

+0

@ user2843145 Помогло ли это? Вам нужна дополнительная помощь по вашему вопросу? – peterm

0

То, что вы пытаетесь достичь, возможно только в том случае, если ваш дополнительный запрос возвращает одну строку. , например, здесь

(SELECT subfield_1 FROM tableb  WHERE subfield_id = field_3) 

поле 3 должно быть первичным ключом для TableB

0

Вы могли бы выполнить outer join, где вы увидите тот же результат без задержки необходимости использовать correlated subquery.

Внешнее соединение имеет то преимущество, что будут отображаться все строки из tablea, независимо от того, есть ли сопровождающее значение в подзапросах tableb.

Нормальное соединение вместо этого будет возвращать только строки, где все три таблицы содержат field_3 и field_4, и в результате строка для field_id = 3 не будет возвращена.

Пример:

SELECT field_id, 
     field_1, 
     s1.subfield_1 as field_a, 
     s2.subfield_1 as field_b 
FROM tablea AS a 
LEFT JOIN tableb AS s1 ON a.field_3 = s1.subfield_id 
LEFT JOIN tableb AS s2 ON a.field_4 = s2.subfield_id 
WHERE field_2 = 123;