2012-03-08 125 views
-2

查询:SQL UNION休息查询

  (
       SELECT 
        upd.uid, 
        upd.update_id, 
        upd.update, 
        upd.date, 
        upd.type, 
        upd.total_likes, 
        upd.total_comments, 
        upd.deleted, 
        usr.username AS `username`, 
        usr.profile_picture AS `profile_picture` 
        ,(
         SELECT 
          COUNT(lik.id) 
         FROM 
          likes as lik 
         WHERE 
          upd.update_id = lik.item_id 
          AND 
          lik.uid = 118697835834 
          AND lik.type=0 
        ) as liked_update, 
        (
         SELECT 
          COUNT(fav.id) 
         FROM 
          favorites as fav 
         WHERE 
          upd.update_id = fav.item_id 
          AND 
          fav.uid = 118697835834 
          AND fav.type=0 
        ) as favorited_update 

       FROM 
        updates AS upd 
        LEFT JOIN 
         users AS usr 
          ON upd.uid = usr.uid 
       WHERE 
        upd.deleted=0 
        AND 
        (
         upd.uid=118697835834 
          OR EXISTS 
          (
           SELECT * 
          FROM 
           subscribers AS sub 
          WHERE 
           upd.uid = sub.suid 
            AND sub.uid = 118697835834 
         ) 
        ) 

      ) 
      UNION 
      (
       SELECT 
        topic.uid, 
        topic.tid, 
        topic.title, 
        topic.body, 
        topic.total_likes, 
        topic.total_replies, 
        topic.views, 
        topic.date, 
        usr.username AS `username`, 
        usr.profile_picture AS `profile_picture` 
        ,(
         SELECT 
          COUNT(lik.id) 
         FROM 
          likes as lik 
         WHERE 
          topic.update_id = lik.item_id 
          AND 
          lik.uid = 118697835834 
          AND lik.type=1 
        ) as liked_update, 
        (
         SELECT 
          COUNT(fav.id) 
         FROM 
          favorites as fav 
         WHERE 
          topic.update_id = fav.item_id 
          AND 
          fav.uid = 118697835834 
          AND fav.type=1 
        ) as favorited_update 

       FROM 
        topics AS topic 
        LEFT JOIN 
         users AS usr 
          ON topic.uid = usr.uid 
       WHERE 
        topic.deleted=0 
        AND 
        (
         topic.uid=118697835834 
          OR EXISTS 
          (
           SELECT * 
          FROM 
           subscribers AS sub 
          WHERE 
           topic.uid = sub.suid 
            AND sub.uid = 118697835834 
         ) 
        ) 

      ) 
      ORDER BY date DESC 

我已经加入了UNION (SELECT)和查询需要永远载入最后它停止返回blank page ...

除去UNION (SELECT)工作正常...

+0

首先,为什么每个列使用缩写别名?这只会让阅读变得更加困难。无论如何,最终的EXISTS条款的想法是什么?您正在使用更新和主题之间的联合,但只能根据更新选择主题。更新和主题将位于结果集中的单独行上,因此,如果您未从更新中进行选择,则更新上存在更新可能不是一个好主意。发动机可能会执行大量的重新驱动循环。 – Tobsey 2012-03-08 12:08:29

+0

我大概可以将EXISTS子句更改为LEFT JOIN ...编辑:我只是删除所有缩短的别名,它似乎加载,但它不加载主题...只是更新... – fxuser 2012-03-08 12:11:23

+0

应该'WHERE'条款那'EXISTS'be' topic.uid = sub.uid AND sub.uid = 118697835834'代替'upd.uid = sub.suid AND sub.uid = 118697835834' – Tobsey 2012-03-08 12:17:30

回答

1

确定所有的评论后,你可以请说你做了什么改变,使脚本工作。

根据您对两个表中的数据处于相同列的说法,因为您已通过使用UNION告诉引擎执行此操作。如果你希望他们在单独的列中,您将需要放置在空值之间:

SELECT 
    upd.uid, 
    upd.update_id, 
    upd.update, 
    upd.date, 
    upd.type, 
    upd.total_likes, 
    upd.total_comments, 
    upd.deleted, 
    null AS `topicuid`, 
    null AS `topictid`, 
    null AS `topictitle`, 
    null AS `topicbody`, 
    null AS `topictotal_likes`, 
    null AS `topictotal_replies`, 
    null AS `topicviews`, 
    null AS `topicdate`, 
    usr.username AS `username`, 
    usr.profile_picture AS `profile_picture`, 
    (SELECT COUNT(lik.id) FROM likes as lik WHERE upd.update_id = lik.item_id AND lik.uid = 118697835834 AND lik.type=0) as liked_update, 
    (SELECT COUNT(fav.id) FROM favorites as fav WHERE upd.update_id = fav.item_id AND fav.uid = 118697835834 AND fav.type=0) as favorited_update 
FROM 
    ...... 
UNION ALL 
SELECT 
    null AS `upd.uid`, 
    null AS `upd.update_id`, 
    null AS `upd.update`, 
    null AS `upd.date`, 
    null AS `upd.type`, 
    null AS `upd.total_likes`, 
    null AS `upd.total_comments`, 
    null AS `upd.deleted`, 
    topic.uid, 
    topic.tid, 
    topic.title, 
    topic.body, 
    topic.total_likes, 
    topic.total_replies, 
    topic.views, 
    topic.date, 
    usr.username AS `username`, 
    usr.profile_picture AS `profile_picture`, 
    (SELECT COUNT(lik.id) FROM likes as lik WHERE topic.update_id = lik.item_id AND lik.uid = 118697835834 AND lik.type=1) as liked_update, 
    (SELECT COUNT(fav.id) FROM favorites as fav WHERE topic.update_id = fav.item_id AND fav.uid = 118697835834 AND fav.type=1) as favorited_update 

你可能需要做的列名更多的工作,但你到达那里。我没有投下这个问题,但我可能应该。您应该了解UNION运算符对两个或更多查询实际做了什么。

+1

不得不使用NULL来让它们正确,但这是我需要的,谢谢。 – fxuser 2012-03-08 17:01:11

0

当您使用UNION时,您必须具有完全相同的结果“列格式,名称,...”,因此您在查询upd.total_comments的顶部为total_comments,最下面为topic.total_replies为total_replies t软管是不同的名称。希望你明白我试图解释,如果没有访问here它更好地解释。

+0

得到它,所以我可以重命名total_replies total_comments,但它会给我total_replies数据.. 。 – fxuser 2012-03-08 12:03:38

+0

你可以在第二个(unioned)选择中改变名字,方法是给它别名,就像你做过的topic.total_replies为total_replies,只需要把它命名为total_comments就像第一次选择那样。但格式也必须相同,否则你必须对它们进行转换,所以如果字段是bigint,那么其他字符也必须是bigint。 – FeRtoll 2012-03-08 12:06:48

+0

“你必须有完全相同的结果”列格式,名称......“ - 标准SQL中的要求只要求列根据列排序是相同的类型,并且不会比较列名(除非' CORRESPONDING'关键字被使用)我不知道mySQL依赖于'UNION'的列名, – onedaywhen 2012-03-08 12:34:03