带有连接子查询的Mysql查询没有结果

时间:2014-03-04 19:37:32

标签: mysql join subquery

我有一个很大的疑问:

SELECT stories.* 
  FROM stories stories 
   JOIN (SELECT tstories.uid 
           FROM stories tstories 
            JOIN tours_stories_mm mmt 
                ON tstories.uid = mmt.uid_foreign
            JOIN tours tours 
                ON tours.uid = mmt.uid_local
            JOIN tours_countries_rel tourcountryrel 
                ON tours.uid = tourcountryrel.tourid 
            JOIN countries tcountries 
                ON tcountries.uid = tourcountryrel.countryid
           WHERE tcountries.uid = ? 
                 AND tours.deleted = 0 
                 AND tours.hidden = 0 
                 AND tstories.deleted = 0 
                 AND tstories.hidden = 0) as tourstories 
   JOIN (SELECT cstories.uid 
           FROM stories cstories 
            JOIN individualtourcomponents_stories_mm mmc 
                ON (cstories.uid = mmc.uid_foreign) 
            JOIN individualtourscomponents components 
                ON (components.uid = mmc.uid_local) 
            JOIN individualtourcomponents_countries_rel componentcountryrel 
                ON (components.uid = componentcountryrel.componentid) 
            JOIN countries ccountries 
                ON (ccountries.uid = componentcountryrel.countryid) 
           WHERE ccountries.uid = ? 
                AND components.deleted = 0 
                AND components.hidden = 0 
                AND cstories.deleted = 0
                AND cstories.hidden = 0) as componentstories 
 WHERE stories.uid = componentstories.uid 
    OR stories.uid = tourstories.uid 
 GROUP BY stories.uid`

每个子查询都适用于自己,如果两个子查询具有相同的结果,我会在整个查询中得到一个结果。如果只有一个子查询有结果,我什么也得不到。简单地说它可以写成:

SELECT stories.* 
  FROM stories 
   JOIN (SELECT * FROM table_a WHERE x=5) as table_a 
   JOIN (SELECT * form table_b where x=5) as table_b 
  WHERE stories.uid = table_a.uid OR stories.uid = table_b.uid 
 GROUP BY stories.uid

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您似乎应该使用OUTER JOIN而不是INNER JOIN来加入源表。

使用简化的查询示例,它可能如下所示:

SELECT stories.* 
  FROM stories 
   LEFT OUTER JOIN (SELECT * FROM table_a WHERE x=5) as table_a 
                ON stories.uid = table_a.uid
   LEFT OUTER JOIN (SELECT * form table_b where x=5) as table_b 
                ON stories.uid = table_b.uid 
 GROUP BY stories.uid

<强>更新

根据您的评论,听起来您实际上想要获得两个子查询的明确联合。

如果是这种情况,您可以像这样修改原始查询:

  (SELECT tstories.*
     FROM stories tstories 
      JOIN tours_stories_mm mmt 
          ON tstories.uid = mmt.uid_foreign
      JOIN tours tours 
          ON tours.uid = mmt.uid_local
      JOIN tours_countries_rel tourcountryrel 
          ON tours.uid = tourcountryrel.tourid 
      JOIN countries tcountries 
          ON tcountries.uid = tourcountryrel.countryid
      WHERE tcountries.uid = ? 
            AND tours.deleted = 0 
            AND tours.hidden = 0 
            AND tstories.deleted = 0 
            AND tstories.hidden = 0
   )
UNION DISTINCT
  (SELECT cstories.*
     FROM stories cstories 
      JOIN individualtourcomponents_stories_mm mmc 
          ON (cstories.uid = mmc.uid_foreign) 
      JOIN individualtourscomponents components 
          ON (components.uid = mmc.uid_local) 
      JOIN individualtourcomponents_countries_rel componentcountryrel 
          ON (components.uid = componentcountryrel.componentid) 
      JOIN countries ccountries 
          ON (ccountries.uid = componentcountryrel.countryid) 
     WHERE ccountries.uid = ? 
           AND components.deleted = 0 
           AND components.hidden = 0 
           AND cstories.deleted = 0
           AND cstories.hidden = 0
  )