我的问题是:从同一个表加入时是否可以输出多行? 以这个代码为例,我希望它输出2行,每个表一个。相反,它的作用是给我一行所有数据。
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)
此查询修复了我的问题。但似乎我的问题的答案是不使用JOIN
而是使用UNION
。
答案 0 :(得分:0)
你的意思是t1的一行和t2的一行?
你正在寻找UNION,而不是JOIN。
select * from table where id = 1
union
select * from table where oldid = 1
答案 1 :(得分: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
交叉连接明确地将行数乘以(在这种情况下)附加的序列号。
答案 2 :(得分:0)
好吧,因为它是同一张桌子,你可以这样做:
SELECT t2.*
FROM table t1
JOIN table t2
ON t2.id = t1.oldId
OR t2.id = t1.id
WHERE t1.id = '1'