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

时间:2013-03-02 18:32:34

标签: mysql sql join left-join inner-join

我有两张桌子。

让我们说表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'

结果集:

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       null       ....

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

3 个答案:

答案 0 :(得分:3)

你可以这样做:

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

答案 1 :(得分:2)

如果我理解正确,您希望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'

答案 2 :(得分:1)

我不确定这是否有效但是试试这个。

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