2

我想根据两个关系表从表中选择用户

结构:

[user]

uid | firstname | lastname | ...
---------------------------------
482 | USERa     | USERa    | ...
885 | USERb     | USERb    | ...
405 | USERc     | USERc    | ...
385 | USERd     | USERd    | ...

[news_info]

uid_local   | uid_foreign
--------------------------------
125         | 482       
100         | 405       

[news_add]

uid_local   | uid_foreign
--------------------------------
125         | 885   
105         | 385   

现在我只想通过 uid_local -> 125 选择 USERa 和 USERb,来自 [news_info] 和 [news_add]

SELECT 
  nnfo.uid_local, 
  user.* 
FROM user
  JOIN news_info nnfo
    ON nnfo.uid_foreign = user.uid
WHERE nnfo.uid_local = 125 

结果 = USERa // 有效

SELECT 
  nadd.uid_local,
  user.* 
FROM user
  JOIN news_add nadd
    ON nadd.uid_foreign = user.uid
WHERE nadd.uid_local = 125

结果 = USERb // 有效

现在将 sql 语句“合并”为一个...以获取 USERa 和 USERb

SELECT 
  nnfo.uid_local, 
  nadd.uid_local,
  user.* 
FROM user
  JOIN news_info nnfo
    ON nnfo.uid_foreign = user.uid
  JOIN news_add nadd
    ON nadd.uid_foreign = user.uid
WHERE nnfo.uid_local = 125 AND nadd.uid_local = 125

结果 = 空 // 没有错误.....

出了什么问题...我尝试了其他一些陈述,但没有结果:(

4

2 回答 2

2

您的uid_localID 存在于不同的行中:因此,当您想要 AND 结果时,您什么也得不到(因为没有任何相交)。你可以用工会做到这一点:

SELECT * from
(
SELECT 
  nnfo.uid_local, 
  user.firstname, user.lastname 
FROM user
  JOIN news_info nnfo
    ON nnfo.uid_foreign = user.uid
WHERE nnfo.uid_local = 125 

UNION ALL

SELECT 
  nadd.uid_local,
  user.firstname, user.lastname 
FROM user
  JOIN news_add nadd
    ON nadd.uid_foreign = user.uid
WHERE nadd.uid_local = 125
) x
于 2013-07-22T13:10:38.783 回答
1

合并查询结果时,有两种不同的方法:

  • 联盟
  • 加入

要知道选择哪一个,您必须知道您希望合并的 2 个查询中的表之间是否存在技术链接。在您的情况下,有一个功能链接 ( nnfo.uid_local = 125 AND nadd.uid_local = 125),但加入这两个宇宙是不够的。你仍然可以只用一个得到结果SELECT,但我认为最终的结果会不清楚,并且在某种程度上不符合 SQL 提供的精神。

我会选择 UNION 解决方案:

SELECT 
  nnfo.uid_local, 
  user.* 
FROM user
  JOIN news_info nnfo
    ON nnfo.uid_foreign = user.uid
WHERE nnfo.uid_local = 125 
UNION
SELECT 
  nadd.uid_local,
  user.* 
FROM user
  JOIN news_add nadd
    ON nadd.uid_foreign = user.uid
WHERE nadd.uid_local = 125

编辑:我看到 davek 的结果实现UNION ALL而不是UNION. 我假设如果 USERa 碰巧出现在两个独立查询中,您希望只返回一次,这就是为什么我使用简单UNION运算符与UNION ALL也会返回重复结果的原因。

于 2013-07-22T13:16:53.623 回答