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表
中的列。使用一个表进行通知还是比较容易的。仅仅因为其中一个通知需要一个原因,并不意味着其他类型也不能使用该表并使该原因字段为空。谢谢。回答得很好。您建议采用什么样的数据结构?我至少要两张桌子还是一张?谢谢。回答得很好。您建议采用什么样的数据结构?我至少要两张桌子还是一张?