【发布时间】: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 中的EXISTSbetopic.uid = sub.uid AND sub.uid = 118697835834而不是upd.uid = sub.suid AND sub.uid = 118697835834 -
@Tobsey 纠正错字,是我的错
-
两个select语句分开运行会返回数据吗?你也试过用
UNION ALL而不是UNION。后者删除重复记录,因此速度较慢。我认为你的陈述永远不会产生重复。