【问题标题】:sql UNION breaks querysql UNION 中断查询
【发布时间】:2012-03-08 11:56:43
【问题描述】:

查询:

            (
                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 ) 工作正常...

【问题讨论】:

  • 首先,为什么要为每一列使用缩短的别名?它只会让阅读变得更加困难。无论如何,最后的 EXISTS 子句的想法是什么?您在更新和主题之间使用联合,但仅根据更新选择主题。更新和主题将位于结果集中的单独行中,因此当您不从更新中选择时,对更新执行存在可能是一个坏主意。引擎可能正在执行大量的递归循环。
  • 我可能可以将 EXISTS 子句更改为 LEFT JOIN...编辑:我刚刚删除了所有缩短的别名,它似乎已加载但它不加载主题...只是更新...
  • 应该 WHEREclause 中的 EXISTSbe topic.uid = sub.uid AND sub.uid = 118697835834 而不是 upd.uid = sub.suid AND sub.uid = 118697835834
  • @Tobsey 纠正错字,是我的错
  • 两个select语句分开运行会返回数据吗?你也试过用UNION ALL而不是UNION。后者删除重复记录,因此速度较慢。我认为你的陈述永远不会产生重复。

标签: mysql sql union left-join


【解决方案1】:

好吧,在所有的 cmets 之后,您能否说出您为使脚本正常工作所做的更改。

鉴于您对来自两个表的数据位于同一列中的评论,这是因为您已告诉引擎使用 UNION 来执行此操作。如果您希望它们在单独的列中,则需要将 Nulls 放置在它们之间:

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 运算符对两个或更多查询的实际作用。

【讨论】:

  • 不得不玩弄空值以使它们正确,但这是我需要的,谢谢。
【解决方案2】:

当您使用 UNION 时,您必须具有完全相同的结果“列格式、名称、...”,因此您在查询 upd.total_cmets 的顶部有 total_comments,底部有 topic.total_replies 作为 total_replies这些是不同的名称。希望您能理解我试图解释的内容,如果没有,请访问here 那里解释得更好。

【讨论】:

  • 知道了,所以我可以将 total_replies 重命名为 total_cmets 但它会给我数据中的 total_replies...
  • 您可以更改第二个(联合)选择中的名称,方法是像您将 topic.total_replies 命名为 total_replies 一样为其指定别名,只是您必须像第一次选择一样将其命名为 total_cmets。但格式也必须相同,否则您必须对其进行转换,因此如果字段为 bigint,则其他字段也必须为 bigint。
  • "你必须有完全相同的结果 "列格式,名称,..." -- 标准 SQL 中的要求只要求列是基于列排序的相同类型,而不是比较列名(除非使用了CORRESPONDING 关键字)。我不知道mySQL 依赖于UNION 的列名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 2013-10-04
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
相关资源
最近更新 更多