MYSQL 选择子查询如果存在
Posted
技术标签:
【中文标题】MYSQL 选择子查询如果存在【英文标题】:MYSQL Select Subquery IF exists 【发布时间】:2015-08-02 08:15:18 【问题描述】:我有 3 个表 ....用户、更新和颠簸。
我想向发出 api 请求的用户返回以最新顺序更新的提要,其中包含显示提要中的每个状态所需的所有数据。 我还需要包括更新是否被发出 api 请求的用户“碰撞”(碰撞 = 喜欢 facebook 上的状态)
简而言之,这就是我正在尝试做的事情,即使此查询的 if 计数区域与语法不符:
SELECT b.type,b.owner,b.update_img,b.ALBUM_ID,b.last_comment,a.uid, a.first_name, a.last_name, a.gender, a.thumb_img, b.msg_id, b.message, b.created,b.POST_PRIVACY,
(if count( SELECT * FROM BUMPS WHERE b.msg_id= BUMPS.MSG_ID_FK AND BUMPS.UID_FK=$loggedin_uid)>0 THEN 1 ELSE null) as 'isBumpedBool'
FROM users AS a, updates AS b
WHERE b.uid_fk = a.uid
AND b.type<>'FRIEND_RELATIONSHIP'
AND b.created<$time
AND b.type<>'FAMILIAR_RELATIONSHIP'
AND a.college='$college'
AND b.POST_PRIVACY<>'4'
AND b.POST_PRIVACY<>'5'
AND b.created>=$tstamp
ORDER BY b.created DESC
LIMIT 100
有什么想法吗?
【问题讨论】:
【参考方案1】:添加一个 LEFT JOIN 以将所有这些结果 JOIN 到 BUMPS 并在值不存在时返回 NULL
SELECT b.type,
b.owner,
b.update_img,
b.ALBUM_ID,
b.last_comment,
a.uid,
a.first_name,
a.last_name,
a.gender,
a.thumb_img,
b.msg_id,
b.message,
b.created,
b.POST_PRIVACY,
(CASE WHEN bm.MSG_ID_FK IS NOT NULL THEN 1 ELSE NULL END) AS 'isBumpedBool'
FROM users AS a JOIN
updates AS b
ON b.uid_fk = a.uid
AND b.type<>'FRIEND_RELATIONSHIP'
AND b.created<$time
AND b.type<>'FAMILIAR_RELATIONSHIP'
AND a.college='$college'
AND b.POST_PRIVACY<>'4'
AND b.POST_PRIVACY<>'5'
AND b.created>=$tstamp
LEFT JOIN BUMPS as bm
ON b.msg_id= bm.MSG_ID_FK
AND bm.UID_FK=$loggedin_uid
ORDER BY b.created DESC LIMIT 100
【讨论】:
无限查询让我觉得如果我这样做,我会失去所有我希望的速度提升。加载了 20 秒还是没有结果。 颠簸状态是一对多的关系。许多不同的用户可以碰撞状态,但我只想知道发出请求的用户是否碰撞了每一行。 idk 这意味着什么,在凹凸表和更新表中? 100 个中的 100 个。 .但是最后一个查询已经冻结了我的服务器,从来没有得到结果。现在正在重置。 @ChuckKelly 用表格定义编辑你的问题,你可以用SHOW CREATE TABLE tablename
得到它
冻结我的整个服务器一个小时。我觉得这可能是不可能的。以上是关于MYSQL 选择子查询如果存在的主要内容,如果未能解决你的问题,请参考以下文章