如何在同一查询中执行连续SELECTS

时间:2015-04-08 11:09:22

标签: mysql sql database-performance

有一个包含以下表格的数据库:

table_1: id, atr1
table_2: id, atr2
table_3: id, table_1_id(Foreign Key), table_2_id(Foreign Key), atr3

我想要进行的操作有点复杂,我可以解释一下,除了SQL查询之外还要做一些额外的编程。

操作的第一部分是获取table_3中table_2的所有标识符,这些标识符符合某些条件。

SELECT table_3.table_2_id
FROM table_3
WHERE
table_3.atr3 = 'value1' AND
table_3.table_1_id = 'value2'

接下来的部分是获取我刚刚获得的每个值,然后在以下查询中使用它们。我会循环播放。

SELECT table_3.id, table_3.atr3, table_1.atr1, table_2.atr2
FROM table_3
JOIN table_1 ON table_3.table_1_id = table_1.id
JOIN table_2 ON table_3.table_2_id = table_2.id
WHERE
table_3.table_2_id = 'current_value_i_am_iterating_over' AND
(table_3.table_1_id = 'value4' OR
table_3.table_1_id = 'value5')

在查询之后,我会在一个数组中连接获得的行,该数组包含我在循环的连续迭代中获得的所有行。

我想知道的是,是否有办法避免第二个循环,理想情况下只在一个SQL查询中进行整个操作。

3 个答案:

答案 0 :(得分:2)

您不能使用简单的子查询吗?我的意思是你可以拥有

table_3.table_2_id = (your first query with limit 1)

限制1只是为了避免从子查询返回多个记录 或者你可以使用IN

table_3.table_2_id IN (your first query)

答案 1 :(得分:1)

您可以将查询标记为in

SELECT t3.id, t3.atr3, t1.atr1, t2.atr2
FROM table_3 t3 JOIN
     table_1 t1
     ON t3.table_1_id = t1.id JOIN
     table_2 t2
     ON t3.table_2_id = t2.id
WHERE t3.table_2_id IN (SELECT table_2_id
                        FROM table_3
                        WHERE atr3 = 'value1' AND table_1_id = 'value2'
                       ) AND
      t3.table_1_id IN ('value4', 'value5');

这是将逻辑添加到单个查询中的最直接方式。

答案 2 :(得分:0)

;with cte as (
SELECT table_3.table_2_id
FROM table_3
WHERE
table_3.atr3 = 'value1' AND
table_3.table_1_id = 'value2')

SELECT table_3.id, table_3.atr3, table_1.atr1, table_2.atr2
FROM table_3
JOIN table_1 ON table_3.table_1_id = table_1.id
JOIN table_2 ON table_3.table_2_id = table_2.id
JOIN cte on table_3.table_2_id = cte.table_2_id
WHERE
(table_3.table_1_id = 'value4' OR
table_3.table_1_id = 'value5')

使用公用表表达式并添加额外的连接,无需循环它。