Php MySQL中使用IF-ELSE的条件连接语句
我正在为我的社交网络应用程序制定通知计划。我有不同类型的通知,分为两类:与朋友相关的通知和与事件相关的通知。目前,我的数据库架构如下所示:Php MySQL中使用IF-ELSE的条件连接语句,php,mysql,sql,Php,Mysql,Sql,我正在为我的社交网络应用程序制定通知计划。我有不同类型的通知,分为两类:与朋友相关的通知和与事件相关的通知。目前,我的数据库架构如下所示: +---------------------+------------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-
+---------------------+------------------------+------+-----+---------+----------------+
| 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 | |
+---------------------+------------------------+------+-----+---------+----------------+
现在,我有两个不同的表用于事件相关通知和朋友相关通知。以下是事件相关通知表的架构:
+-------------------------+----------------------------------------------------+------+-----+---------+-------+
| 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 | |
+-------------------------+----------------------------------------------------+------+-----+---------+-------+
对于每种类型的通知,kicked
,added
,new message
,info edited
我又多了4个表,因为每种通知都需要不同类型的属性(例如,kicked
需要一个原因)
现在,我想编写一个条件SQL查询,以便它将通知
与事件通知
连接起来,如果通知类型
是事件
的话
从notification_表t中选择*其中t.seen=FALSE和t.user_id=?内部连接事件\u通知en ON(t.notification\u type='event'和en.notification\u id=t.notification\u id)内部连接
将会有这么多的内部连接,有没有更好的方法?我认为我的查询也不是很优化,如果能提供任何帮助,我将不胜感激。您可以使用连接。但是,您希望使用左外部联接而不是内部联接创建查询:
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 ...
不要担心连接的扩散。如果您的表具有适当的索引,那么它们的性能将很好
请考虑更改数据结构,以便对不同的通知类型只有一个表。有几个不使用的字段不会增加很多性能开销,尤其是考虑到有这么多连接的复杂性和拥有更多表的额外管理开销。 您可以使用连接。但是,您希望使用左外部联接而不是内部联接创建查询:
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 ...
不要担心连接的扩散。如果您的表具有适当的索引,那么它们的性能将很好
请考虑更改数据结构,以便对不同的通知类型只有一个表。有几个不被使用的字段不会增加很多性能开销,尤其是考虑到有这么多连接的复杂性和拥有更多表的额外管理开销。你希望结果看起来像什么?您正在建议与所有其他表进行联接,但只返回
通知\u表
中的列。使用一个表进行通知还是比较容易的。仅仅因为其中一个通知需要一个原因,并不意味着其他类型也不能使用该表并使该原因字段为空。您希望结果是什么样的?您正在建议与所有其他表进行联接,但只返回通知\u表
中的列。使用一个表进行通知还是比较容易的。仅仅因为其中一个通知需要一个原因,并不意味着其他类型也不能使用该表并使该原因字段为空。谢谢。回答得很好。您建议采用什么样的数据结构?我至少要两张桌子还是一张?谢谢。回答得很好。您建议采用什么样的数据结构?我至少要两张桌子还是一张?