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 选择子查询如果存在的主要内容,如果未能解决你的问题,请参考以下文章

如果数据存在,则更新其他插入,使用子查询或等的mysql [重复]

在 MySQL 子查询中选择多个列/字段

MySQL - 如果选择子查询中的计数为空,则更改为 0

那个mysql 子查询和连接查询 一般常用哪个 谁效率高些

mysql中主查询和子查询关系是啥?

带有子查询的 MySQL UPDATE 查询永远存在