1

我的问题是:从同一个表加入时是否可以输出多行?例如,使用此代码,我希望它输出 2 行,每个表一个。相反,它的作用是给我 1 行的所有数据。

SELECT t1.*, t2.* 
FROM table t1
JOIN table t2 
    ON t2.id = t1.oldId
WHERE t1.id = '1'

更新
好吧,我对 UNION/UNION ALL 的问题是:我不知道 t1.oldId 值等于什么。我只知道 t1 的 id。我试图避免使用 2 个查询,所以有没有办法可以做这样的事情:

SELECT t1.*
FROM table t1
WHERE t1.id = '1'

UNION

SELECT t2.*
FROM table t2
WHERE t2.id = t1.oldId

样本数据

messages_users
id    message_id   user_id   box   thread_id   latest_id
--------------------------------------------------------
8     1            1         1     NULL        NULL
9     2            1         2     NULL        16
10    2            65        1     NULL        15
11    3            65        2     2           NULL
12    3            1         1     2           NULL
13    4            1         2     2           NULL
14    4            65        1     2           NULL
15    5            65        2     2           NULL
16    6            1         1     2           NULL

Query:
SELECT mu.id FROM messages_users mu
JOIN messages_users mu2 ON mu2.latest_id IS NOT NULL
WHERE mu.user_id = '1' AND mu2.user_id = '1' AND ((mu.box = '1' 
AND mu.thread_id IS NULL AND mu.latest_id IS NULL) OR mu.id = mu2.latest_id)

这个查询解决了我的问题。但似乎我的问题的答案是不要使用 aJOIN而是 a UNION

4

3 回答 3

0

你的意思是 t1 的一排和 t2 的一排?

您正在寻找 UNION,而不是 JOIN。

select * from table where id = 1
union
select * from table where oldid = 1
于 2012-07-16T18:57:36.240 回答
0

如果您尝试将表中的行相乘,则需要 UNION ALL(而不是 UNION):

select *
from ((select * from t) union all
      (select * from t)
     ) t

我有时也使用交叉连接来做到这一点:

select *
from t cross join
     (select 1 as seqnum union all select 2) vals

交叉连接显式地将行数相乘,在这种情况下,附加了一个序列号。

于 2012-07-16T19:01:13.053 回答
0

好吧,因为它是同一张桌子,你可以这样做:

SELECT t2.*  
FROM table t1 
JOIN table t2  
  ON t2.id = t1.oldId 
  OR t2.id = t1.id
WHERE t1.id = '1'
于 2012-07-16T19:48:38.190 回答