MySql:如何使用单个查询选择两个表之间的所有连接行和首先满足条件的所有行



我有两个表。

假设表p和表q。下面是我所做的:

select p.*, q.* 
from p inner join q on p.field = q.field 
where q.col = 'someValue';

假设结果集是这样的:

<>之前P.field . q.field ....5 5……6 6……12 12…55 55 ....3 3……之前

现在我想选择这些行和使用单个查询:

select p.*  
from p where p.sat = 'value'

resultset:

<>之前p.field……44……93年 ...13 . .8 ....55……之前

我不想使用union或子查询。

但是,我想在以下(示例)结果集中统一/合并这些行:

<>之前P.field . q.field ....5 5……6 6……12 12…55 55 ....44 null…93 null…13 null ..8空....之前

我必须将两个结果集连接到第三个表,并按第三个表中的字段排序(如果重要的话)。

你可以这样做:

SELECT
  p1.*, 
  q.* ,
  p2.* -- Note that you might need to change the columns' names 
       -- with different aliases than those selected from p1.*
FROM p       AS p1
INNER JOIN q        ON p.field = q.field 
INNER JOIN p AS p2  ON p.field = p2.field 
                   AND p2.sat = 'value'
WHERE q.col = 'someValue'
-- ORDER BY ...;

我认为你必须使用UNION,像这样:

SELECT
  p.field field1,
  q.field field2
FROM p
INNER JOIN q  ON p.field = q.field
UNION ALL
SELECT p.field, NULL
FROM p
WHERE sat = 'value';

这将给你:

| FIELD1 | FIELD2 |
-------------------
|      5 |      5 |
|      6 |      6 |
|     12 |     12 |
|     55 |     55 |
|      3 |      3 |
|     55 |     55 |
|     44 | (null) |
|     93 | (null) |
|     13 | (null) |
|      8 | (null) |
|     55 | (null) |

SQL Fiddle Demo

如果我理解正确,您希望所有行p.sat = 'value'以及满足q上的连接和条件的行。这最容易表示为left outer join:

select p.*, q.* 
from p left outer join
     q
     on p.field = q.field 
where p.sat = 'value' or q.col = 'someValue'

我不确定这是否会起作用,但试试这个

SELECT p.*, q.* FROM p, q WHERE (p.field = q.field AND q.col = 'someValue') OR (q.sat = 'value')

最新更新