Объединение двух запросов на выборку - PullRequest
1 голос
/ 09 сентября 2010

А в момент, когда я использую два запроса, один вызывается изначально, а второй вызывается во время цикла по результатам первого.Я хочу объединить оба запроса, но пока не смог.Таблицы, из которых извлекаются запросы:

+--------------+    +--------------+    +--------------------------+
|    table_1   |    |    table_2   |    |          table_3         |
+----+---------+    +----+---------+    +----+----------+----------+
| id |   name  |    | id |   name  |    | id |  tbl1_id |  tbl2_id | 
+----+---------+    +----+---------+    +----+----------+----------+
| 1  | tbl1_1  |    | 1  | tbl2_1  |    | id |     1    |     1    |
| 2  | tbl1_2  |    | 2  | tbl2_2  |    | id |     3    |     2    |
| 3  | tbl1_3  |    | 3  | tbl2_3  |    | id |     3    |     3    |
| 4  | tbl1_4  |    +----+---------+    +----+----------+----------+
+----+---------+

Между table_1 и table_2 в table_3 существует отношение многие ко многим.До сих пор я использовал для разделения запросов.Один запрос возвращает все содержимое table_1, а второй запрос возвращает значения table_2, которые связаны с table_1 через table_3.Тем не менее, я хотел бы покончить с циклом и уменьшить количество запросов, отправляемых на сервер.Я попытался использовать JOIN:

SELECT table_1.id, table_1.name, table_2.id, table_2.name
FROM table_3
LEFT JOIN table_1 ON (table_3.tbl1_id = table_1.id)
LEFT JOIN table_1 ON (table_2.tbl2_id = table_2.id)

Это вернуло очень много желаемого, за исключением того, что оно вернуло только те значения, которые были в table_3, исключая некоторые значения из table_1.Я пытался использовать подзапросы:

SELECT  table_1.id,
    table_1.name,
    (SELECT table_2.id FROM table_2, table_3 WHERE table_2.id = table_3.tbl2_id AND table_1.id = table_3.tbl1_id) AS tbl_2_id,
    (SELECT table_2.name FROM table_2, table_3 WHERE table_2.id = table_3.tbl2_id AND table_1.id = table_3.tbl1_id) AS tbl_2_name
FROM table_1

Это дало ERROR 1242.До сих пор я не смог заставить что-либо работать.Результат, который я ищу, похож на этот.

+---------------+---------------+---------------+---------------+
|table_1.id |table_1.name   |table_2.id |table_2.name   |
+---------------+---------------+---------------+---------------+
|      1    |    tbl1_1 |      1    |    tbl2_1 |
|      2    |    tbl1_2 |       |       |
|      3    |    tbl1_3 |      2    |    tbl2_2 |
|      3    |    tbl1_3 |      3    |    tbl2_3 |
|      4    |    tbl1_4 |       |       |
+---------------+---------------+---------------+---------------+

Кроме того, я хотел бы иметь возможность упорядочить результаты как по table_1.name, так и по table_2.name.Если у кого-нибудь есть предложение, пожалуйста, дайте мне знать.

Ответы [ 3 ]

1 голос
/ 09 сентября 2010

Чтобы получить строки из таблицы_1, которые не имеют совпадений в других таблицах, следует использовать ВНЕШНЕЕ СОЕДИНЕНИЕ вместо ВНУТРЕННЕГО СОЕДИНЕНИЯ:

SELECT
    table_1.id,
    table_1.name,
    table_2.id,
    table_2.name
FROM table_1
LEFT JOIN table_3 ON table_3.tbl1_id = table_1.id
LEFT JOIN table_2 ON table_3.tbl2_id = table_2.id

Результат:

table_1.id  table_1.name  table_2.id  table_2.name
1           'tbl1_1'      1           'tbl2_1'    
2           'tbl1_2'                  ''          
3           'tbl1_3'      2           'tbl2_2'    
3           'tbl1_3'      3           'tbl2_3'    
4           'tbl1_4'                  ''          
0 голосов
/ 10 сентября 2010

Изменение LEFT JOIN на RIGHT JOIN и порядок, в котором два соединения появляются в запросе, решили эту проблему.Вот копия рабочего кода;

SELECT  table_1.id,
    table_1.name,
    table_2.id,
    table_2.name
FROM    table_3
RIGHT JOIN  table_2 ON (table_3.tbl2_id = table_2.id)
RIGHT JOIN  table_1 ON (table_3.tbl1_id = table_1.id)
ORDER BY table_1.name ASC, table_2.name ASC;
0 голосов
/ 09 сентября 2010

То есть вы просто пытаетесь распечатать все связанные пары?Как насчет:

SELECT table_1.id, table_1.name, table_2.id, table_2.name
FROM table_3
INNER JOIN table_1 ON table_1.id = table_3.tbl1_id
INNER JOIN table_2 ON table_2.id = table_3.tbl2_id
ORDER BY table_1.id, table_2.id
...