gpt4 book ai didi

如果特定值为 1,MySQL 执行 INNER JOIN

转载 作者:行者123 更新时间:2023-11-29 13:48:41 25 4
gpt4 key购买 nike

我有这个查询:

SELECT 
e.*, u.name AS event_creator_name
FROM `edu_events` e
LEFT JOIN `edu_users` u
ON u.user_id = e.event_creator
INNER JOIN `edu_event_participants`
ON participant_event = e.event_id && participant_user = 1
WHERE
MONTH(e.event_date_start) = 6
AND YEAR(e.event_date_start) = 2013

它工作完美,但是,我只想在值 e.event_type 等于 1 时执行 INNER JOIN。如果不是,它应该忽略 INNER JOIN。

我已经尝试了一段时间来解决这个问题,但解决方案似乎很难实现我的建议(因为它仅适用于选择/特定值)。

我正在考虑这样的事情:

SELECT 
e.*, u.name AS event_creator_name
FROM `edu_events` e
LEFT JOIN `edu_users` u ON u.user_id = e.event_creator

if(e.event_type == 1) {
INNER JOIN `edu_event_participants` ON participant_event = e.event_id && participant_user = 1
}

WHERE MONTH(e.event_date_start) = 6
AND YEAR(e.event_date_start) = 2013

最佳答案

根据 @Matthias 的进一步反馈,我编辑了以下内容

-- This will get all events for a given user plus all globals
SELECT
e.*,
u.name AS event_creator_name
FROM `edu_users` u

-- in the events
INNER JOIN `edu_events` e 
ON (
-- Get all the ones that the user is participant
e.event_creator = u.user_id
-- Or where event_type is 1
OR
e.event_type = 1
)
AND e.event_date_start BETWEEN DATE('2013-06-01') AND DATE('2013-07-01')
    
-- Add in event participants even though it doesn't seem to be used?
INNER JOIN `edu_event_participants` AS eep
ON eep.participant_event = e.event_id
AND eep.participant_user = 1
    
-- Add the user ID into the WHERE
WHERE u.user_id = 1;

这可能没有太大意义,因为感觉 edu_event_participants 中包含了太多信息。event_creator 实际上应该针对事件本身进行存储,然后 event_participants 只包含事件 id、用户 id 和用户类型。

如果您希望获取某个事件的所有用户,最好对该事件进行单独的查询,以根据 event_id 选择所有用户

关于使用 MONTH() 和 YEAR() 的注释。这将触发表扫描,因为 MySQL 需要将 MONTH() 和 YEAR() 函数应用于所有行,以确定哪些行与 WHERE 语句匹配。如果您计算上限和下限(即 2013-06-01 00:00:00 <= e.event_date_start < 2013-07-01 00:00:00 ),那么 MySQL 可以对索引使用更有效的范围扫描(假设 e.event_date_start 上存在一个索引)

关于如果特定值为 1,MySQL 执行 INNER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17034071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com