cuốn sách gpt4 ai đã làm

mysql - 用几个 LEFT JOIN 查询,没有得到想要的结果

In lại Tác giả: Hồ Xil 更新时间:2023-11-01 08:47:12 28 4
mua khóa gpt4 Nike

这是一个 sql fiddle

谁能告诉我如何使用 LEFT JOIN 获得此输出?

 notification_recipient pm_sender msg modification_page_id 
Peter Tom Hello NULL
notification_recipient pm_sender msg modification_page_id
Peter NULL NULL 2

这是我试过的查询:

   SELECT u.name AS notification_recipient,us.name AS pm_sender,
p.msg,um.page_id AS modification_page_id
FROM notification n
LEFT JOIN pm p ON p.pm_id = n.pm_id
LEFT JOIN users u ON u.user_id = p.recipent_id
LEFT JOIN users us ON us.user_id = p.sender_id
LEFT JOIN user_modification um ON um.modification_id = n.modification_id
WHERE u.name = 'Peter'
AND n.is_read = '0'

我一直在寻找某种类型的条件联接,这意味着根据字段中是否存在值来联接不同的表,但我找不到适用于我的示例的方法。任何其他有效的解决方案也将不胜感激。

背景:

我打算制作一个通知系统,向用户发送不同类型的消息(用户之间的私有(private)消息,他们对条目的修改已获批准的消息等)。当用户登录时,我想查询以查明该用户是否有任何未读通知。如果是,将通过 Ajax 向他发送通知。

为了说明,假设 Tom 给 Peter 发送了一条私有(private)消息,并且他对条目的修改被批准,将调用表 pmuser_modification 中的两个触发器来在 notification 中添加两个新行。 pm_id 列由 pm 引用,modification_idmodification 引用。 is_read 默认 0 为未读。

这是表架构:

CREATE TABLE notification
(`id` int, `modification_id` int,`pm_id` int,`is_read` int)
;

INSERT INTO notification
(`id`,`modification_id`,`pm_id`,`is_read`)
VALUES
(1,1,NULL,0),
(2,NULL,1,0),
(3,2,NULL,0)
;

CREATE TABLE user_modification
(`modification_id` int, `user_id` int,`page_id` int, `is_approved` int)
;

INSERT INTO user_modification
(`modification_id`,`user_id`,`page_id`,`is_approved`)
VALUES
(1,1,5,1),
(2,2,2,1),
(3,3,3,0)

;

CREATE TABLE pm
(`pm_id` int, `sender_id` int,`recipent_id` int,`msg` varchar(200))
;

INSERT INTO pm
(`pm_id`,`sender_id`,`recipent_id`,`msg`)
VALUES
(1,1,2,'Hello');

CREATE TABLE users
(`user_id` int, `name`varchar(20))
;

INSERT INTO users
(`user_id`,`name`)
VALUES
(1,'Tom'),
(2,'Peter'),
(3,'David')
;

如果用户 David 登录,这是我想要的通知输出。每种消息类型的每一行。

 notification_recipient pm_sender msg modification_page_id 
Peter Tom Hello NULL
notification_recipient pm_sender msg modification_page_id
Peter NULL NULL 2

给 Peter 的通知会是这样的:

        `1.You have received a private message from Tom.
2.your modification on that page is approved`.

câu trả lời hay nhất

这个查询应该可以完成这项工作。这是 SQLFiddle

SELECT
n.id,
IF(pmu.name IS NULL, pmm.name, pmu.name) recipient,
pmus.name sender, pm.msg, m.modification_id
FROM
notification n
LEFT JOIN user_modification m ON (n.modification_id = m.modification_id)
LEFT JOIN pm ON (n.pm_id = pm.pm_id)
LEFT JOIN users pmu ON (pm.recipent_id = pmu.user_id)
LEFT JOIN users pmus ON (pm.sender_id = pmus.user_id)
LEFT JOIN users pmm ON (m.user_id = pmm.user_id)
WHERE
(pmu.name = 'Peter' OR
pmm.name = 'Peter') AND
n.is_read = 0;

关于mysql - 用几个 LEFT JOIN 查询,没有得到想要的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25371937/

28 4 0
Hồ Xil
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress