首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用IF-ELSE的MySQL中的条件连接语句

使用IF-ELSE的MySQL中的条件连接语句
EN

Stack Overflow用户
提问于 2013-04-20 04:17:35
回答 1查看 2.4K关注 0票数 1

我正在为我的社交网络应用程序制定一个通知方案。我有不同类型的通知,分为两组:与朋友相关的和与事件相关的。目前,我的数据库模式是这样的:

代码语言:javascript
运行
复制
+---------------------+------------------------+------+-----+---------+----------------+
| Field               | Type                   | Null | Key | Default | Extra          |
+---------------------+------------------------+------+-----+---------+----------------+
| notification_id     | int(11)                | NO   | PRI | NULL    | auto_increment |
| notification_type   | enum('event','friend') | NO   |     | NULL    |                |
| notification_date   | datetime               | NO   |     | NULL    |                |
| notification_viewed | bit(1)                 | NO   |     | NULL    |                |
| user_id             | int(11)                | NO   | MUL | NULL    |                |
+---------------------+------------------------+------+-----+---------+----------------+

现在,我有两个不同的表来表示与事件相关的通知和与朋友相关的通知。以下是事件相关通知表的模式:

代码语言:javascript
运行
复制
+-------------------------+----------------------------------------------------+------+-----+---------+-------+
| Field                   | Type                                               | Null | Key | Default | Extra |
+-------------------------+----------------------------------------------------+------+-----+---------+-------+
| notification_id         | int(11)                                            | NO   | PRI | NULL    |       |
| event_id                | int(11)                                            | NO   | MUL | NULL    |       |
| event_notification_type | enum('added','kicked','new-message','info-edited') | NO   |     | NULL    |       |
+-------------------------+----------------------------------------------------+------+-----+---------+-------+

同样,对于每种kickedaddednew-messageinfo-edited类型的通知,我还有4个表,因为每种类型的通知都需要不同的属性(例如,kicked需要一个原因)。

现在,我想要编写一个条件SQL查询,以便在notification_typeevent或不同的情况下,它使用event_notification连接notification

SELECT * FROM notification_table t WHERE t.seen = FALSE AND t.user_id =?INNER JOIN event_notification en ON(t.notification_type='event‘AND en.notification_id = t.notification_id) INNER JOIN .....

会有这么多的内部连接,有没有更好的方法呢?我认为我的查询也不是很优化,如果能提供任何帮助,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-20 04:55:27

您可以使用连接。但是,您希望使用左外部联接而不是内部联接创建查询:

代码语言:javascript
运行
复制
SELECT *
FROM notification_table t
WHERE t.seen = FALSE AND t.user_id = ? left JOIN
      event_notification en
      ON(t.notification_type='event' AND en.notification_id = t.notification_id) left JOIN ...

不用担心joins的激增。如果您的表有适当的索引,它们将执行得很好。

请考虑更改数据结构,以便只有一个表用于不同的通知类型。拥有一些不使用的字段并不会增加太多的性能开销,特别是当您考虑到拥有如此多的连接的复杂性和拥有更多表的额外管理开销时。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16112850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档