为什么此查询不返回任何结果?

时间:2013-05-27 03:21:06

标签: mysql

我有两个表,表reseau_stream有关于我的用户帖子的不同信息。用户可以共享其他人的帖子。表reseau_share使得连接成为可能(您有下面两个表的详细信息)。现在,如果用户分享其他人发帖,我必须使用reseau_share的日期时间来订购我的查询。

我没有很多MySQL技能,但在一些帮助下,我终于得到了以下查询。仅当reseau_share中有一行时才有效。如果reseau_share为空,则查询返回0结果。我真的不明白为什么。谁能找出原因?干杯。

表reseau_stream

id   user_id     content        datetime
1    100         Lorem Ipsum1   2013-03-04 19:35:02
2    100         Lorem Ipsum2   2013-03-04 12:35:02

表reseau_share

 id    user_id     target_id     stream_id    datetime
 -------------------- EMPTY ------------------------

查询

SELECT reseau_stream.id,
       reseau_stream.user_id,
       reseau_stream.content,
       IF(reseau_stream.user_id = 100, reseau_stream.datetime, reseau_share.datetime) as datetime 
       FROM reseau_stream, reseau_share 
       WHERE reseau_stream.id 
       IN (
           SELECT id
           FROM reseau_stream
           WHERE user_id = 100
           UNION 
           SELECT stream_id
           FROM reseau_share
           WHERE user_id = 100
        )   ORDER BY  datetime DESC;

2 个答案:

答案 0 :(得分:2)

具有空集的非空集的笛卡儿乘积是空集。

FROM语句中的多个表使用上面的规则来连接两个表,在您的情况下最终得到0个结果。

答案 1 :(得分:2)

基本上,LEFT JOIN上需要reseau_share。现在你有一个FULL OUTER JOIN,其中(a)导致零行,正如@diegoperini所指出的那样,(b)可能不是你真正想要的。目前还不清楚哪两列与这两个表有关。我猜它是user_id

SELECT
  reseau_stream.id,
  reseau_stream.user_id,
  reseau_stream.content,
  IF(reseau_stream.user_id = 100, reseau_stream.datetime, reseau_share.datetime) as datetime 
FROM reseau_stream
LEFT JOIN reseau_share ON reseau_stream.user_id = reseau_share.user_id
WHERE reseau_stream.id 
  IN (
      SELECT id
      FROM reseau_stream
      WHERE user_id = 100
      UNION 
      SELECT stream_id -- or whatever 
      FROM reseau_share
      WHERE user_id = 100
  )
ORDER BY datetime DESC;