当前位置: 首页 > 知识库问答 >
问题:

将备选方案连接到子查询

晏阳飙
2023-03-14

我试图向登录用户显示他们每次登录时尚未看到的通知数。为此,我有以下疑问:

"select count(eventId) as count from notifications where updateId in("
 # 2-the updates NOT IN what the user has seen
 "select updateId from updates where updateId not in("
 # 1-the updates the user has seen
 "select updateId from seen_updates where memberId={}))".format(memberId))

问题是,随着通知数量的增加,这似乎需要一段时间。有没有一种方法可以通过连接做得更好?


mysql> describe notifications;
+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| eventId  | int(10) unsigned | NO   |     | NULL    |       |
| updateId | int(10) unsigned | YES  |     | NULL    |       |
+----------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> describe updates;
+---------------+------------------+------+-----+-------------------+----------------+
| Field         | Type             | Null | Key | Default           | Extra          |
+---------------+------------------+------+-----+-------------------+----------------+
| updated       | timestamp        | NO   |     | CURRENT_TIMESTAMP |                |
| updateId      | int(10) unsigned | NO   | PRI | NULL              | auto_increment |
| eventCategory | varchar(40)      | YES  |     | NULL              |                |
| eventsCount   | int(10) unsigned | NO   |     | NULL              |                |
+---------------+------------------+------+-----+-------------------+----------------+
4 rows in set (0.00 sec)

mysql> describe seen_updates;
+----------+------------------+------+-----+-------------------+-------+
| Field    | Type             | Null | Key | Default           | Extra |
+----------+------------------+------+-----+-------------------+-------+
| updateId | int(10) unsigned | NO   |     | NULL              |       |
| memberId | int(10) unsigned | NO   |     | NULL              |       |
| updated  | timestamp        | NO   |     | CURRENT_TIMESTAMP |       |
+----------+------------

共有2个答案

沈龙光
2023-03-14

没有必要将查询更改为连接并承担风险,因为根据架构,两个索引后面的详细信息首先是主要缺失的对象,这会导致速度变慢

>

表“seed\u Updates”的“member\u id”列上的索引

林亦
2023-03-14

通过连接,您可以这样做:

select     count(eventId) as count 
from       notifications 
inner join updates 
        on updates.updateId = notifications.updateId
left join  seen_updates 
        on seen_updates.updateId = notifications.updateId
       and seen_updates.memberId = {}
where      seen_updates.updateId is null

根据您的数据结构,您甚至可能不需要包含内部连接更新的子句。通知似乎是合乎逻辑的。updateId需要在updates表中有一个现有的对应项。仅当不能保证内部联接需要保留时。

 类似资料:
  • Firebase远程配置有其他选择吗?我需要为中国市场提供一个应用程序,我不确定它是否会起作用

  • 我想在我的应用程序中显示一个外部网站。与Android/iOS的WebView完全相同。 Expo的React Native WebView不支持web平台。https://docs.expo.io/versions/latest/sdk/webview/ 是否有一个世博会友好的替代方案,从web平台中的URL显示外部网站?

  • 我有一个脚本,需要遍历数千个不同但简单的选项。 我可以使用if... elif来迭代它们,但是我想知道是否有比成千上万个elifs更快/更好的选择。举个例子 我将要做的事情通常是运行某种函数。

  • 本文向大家介绍eclipse连接不到genymotion问题的解决方案,包括了eclipse连接不到genymotion问题的解决方案的使用技巧和注意事项,需要的朋友参考一下 (1)很多朋友在使用genymotion开发安卓应用程序的时候,会遇见完全正确的安装但是在运行的时候仍然找不到,genymotion上的设备,在打开的devices上找不到如下图所示: (2)解决的方法如下: 1、关闭ecl

  • 我有两个联合查询,如下所示: 现在,我想在另一个查询中使用此联合。 当我运行它时,我得到ORA-00904:"P"."CUSTOMER_NO":无效的标识符。我需要将h1.customer_no加入到外部查询customer_no。 我看到过一些带有rank的查询,但我不太明白。如何将内部查询与外部查询连接起来? 提前感谢。