gpt4 book ai didi

MySQL 从子查询中提取列以将其附加到主列

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

我是一个做一个小项目的 mySQL 新手。我将尽力完整地描述问题,以便这里的专业人士不仅可以帮助我解决代码问题,还可以帮助我解决概念问题。我以前从未做过 sql,但用 Python、Matlab 等(程序环境)编程过。无需再费周折,

以下代码非常慢,if 语句

if (carts.staffId ='', 'UNASSISTED', 'ASSITED') as EXPERIENCE

不起作用,因为它始终未得到帮助。知道为什么它不起作用吗?

这是代码
select  
Impressions.session_id,
sum(if(Impressions.impressionAction = 'SENDMAIL', 1, 0)) as EMAIL,
count(if(Impressions.impressionAction = 'TAPPED', 1, NULL)) as SCANS,
TIMESTAMPDIFF(SECOND, min(Impressions.createDate), max(Impressions.createDate)) AS Duration,

if (carts.staffId ='', 'UNASSISTED', 'ASSITED') as EXPERIENCE
from Impressions, carts
where Impressions.session_id in (select carts.session_id from carts where carts.session_id <> '' )
group by Impressions.session_id;

专栏 员工编号 存在于名为 的表中推车 .我想要的只是从 上的条件中提取输出员工编号 推车 被添加到表 的列列表中展示次数

本质上,我正在尝试从子查询中添加一列并将其添加到主查询的主列的末尾

更新 : 我把问题分成两部分,下面是代码的样子。本质上,两个输出之间的 UNION 创建所需的最终输出。我只需要一口气:
/***********************ASSISTED*******************************/
select session_id,
sum(if(impressionAction = 'SENDMAIL', 1, 0)) as EMAIL,
count(if(impressionAction = 'TAPPED', 1, NULL)) as SCANS,
TIMESTAMPDIFF(SECOND, min(createDate), max(createDate)) AS Duration
from Impressions
where session_id in
(select session_id
from carts
where session_id <> '' AND staffId <> '' AND staffId <>'ollie' AND staffId<> 'Laura')
AND createDate >= '2014-06-23'AND createDate < '2014-06-30'
AND HOUR(createDate) >= 10 AND HOUR(createDate) < 21
AND impressionId NOT LIKE '%made.com' AND impressionId NOT LIKE '%cloudtags.com%'
group by session_id;



/***************************UNASSISTED***********************/
...everything is same...
where session_id <> '' AND staffId = '' OR staffId ='ollie' OR staffId= 'Laura' )
...;

第二次更新
我忘记在 ASSISTTED 中提及另外一个约束。对比 UNASSISTED案子。除了过滤掉这里的,我还需要过滤掉 productId = 1902来自表 products有一个 cartID与之相关联。

最佳答案

你有一个 CROSS JOIN Impressions 之间的操作和 carts . (是的,您的查询正在执行 JOIN 操作,它只是使用旧式逗号语法来指定 JOIN 操作。)

它是 CROSS JOIN 因为两个表之间没有“匹配”行的谓词; Impressions 中的每一行正在匹配 carts 中的每一行.

你有一个 GROUP BY折叠 carts 中所有“匹配”行的子句到单行; MySQL 从 carts 中的单行中选取值.它从 carts 中选择完全相同的行Impressions 中的每一行.

看起来您想要“匹配”carts 中的行Impressions 中的行使用 session_id 中的值柱子。

像这样的东西:

SELECT i.session_id
, SUM(IF(i.impressionAction = 'SENDMAIL', 1, 0)) AS EMAIL
, COUNT(IF(i.impressionAction = 'TAPPED', 1, NULL)) AS SCANS
, TIMESTAMPDIFF(SECOND, MIN(i.createDate), MAX(i.createDate)) AS Duration
, MIN(IF(c.staffId = '', 'UNASSISTED', 'ASSISTED')) AS EXPERIENCE
FROM Impressions i
JOIN carts c
ON c.session_id = i.session_id
AND c.session_id <> ''
GROUP
BY i.session_id

如果有来自 carts 的多行具有相同的匹配 session_id . MySQL 将只选择一行,并评估 IF(c.staff_id表达。 (或者,将为每一行评估该表达式,并选择要返回的结果值之一。

该 IF 表达式正在测试 staff_id等于零长度字符串(如果 staff_id 是数字,则文字 '' 将被评估为 0 的数值……但我们只是猜测 staff_id 的实际数据类型。)如果 staff_id该行的值为 NULL ,这将不等于空字符串。

我怀疑(但不知道您的用例,所以只是猜测)如果有的话 carts与 session_id 相关的有 staff_id 输入, session 被认为是“协助的”,你想返回“协助”。也就是说,只有在没有 carts 时,您才希望返回“UNASSISTED”。填充了staff_id。为此,我将该 IF 表达式包装在 MIN() 聚合函数中。

编辑

根据添加到问题中的查询,我会做这样的事情:
SELECT i.session_id
, SUM(IF(i.impressionAction = 'SENDMAIL', 1, 0)) AS EMAIL
, COUNT(IF(i.impressionAction = 'TAPPED', 1, NULL)) AS SCANS
, TIMESTAMPDIFF(SECOND, MIN(i.createDate), MAX(i.createDate)) AS Duration
, MIN(IF(c.staffId IN ('','ollie','Laura'), 'UNASSISTED', 'ASSISTED')) AS EXPERIENCE
FROM Impressions i
JOIN carts c
ON c.session_id <> ''
AND c.session_id = i.session_id
WHERE i.createDate >= '2014-06-23'
AND i.createDate < '2014-06-30'
AND HOUR(i.createDate) >= 10
AND HOUR(i.createDate) < 21
AND i.impressionId NOT LIKE '%made.com'
AND i.impressionId NOT LIKE '%cloudtags.com%'
GROUP
BY i.session_id;

请注意,如果 staff_id列有 NULL值,IF 表达式将返回“ASSISTED”,因为 NULL 不等于任何列出的值。要翻转它,以便将 NULL 视为 UNASSISTED,我们可以使用 NOT IN
     , MIN(IF(c.staffId NOT IN ('','ollie','Laura'), 'ASSISTED', 'UNASSISTED')) AS EXPERIENCE

此外,查询不会返回来自 Impressions 的任何行。如果 carts 中没有(至少一个)对应行.

我们可以指定 OUTER JOIN如果我们想从 Impressions 返回行即使 carts 中没有匹配的行.我们将通过添加关键字 来指定它。 LEFT JOIN 之前关键词。请注意,如果我们确实添加了外连接,那么 staff_id列将是 NULL每当在 carts 中找不到匹配的行时. (我们只是想确保在 IF 表达式中正确处理潜在的 NULL 值。)

跟进说明

我们只需要一个 LEFT [OUTER] JOIN如果我们想从 Impressions 返回一行有一个 session_id没有出现在 carts 的任何行中.

如果我们总是在 carts 中有一行对于每个 session_id出现在 Impressions ,你一个 [INNER] JOIN足够A LEFT JOIN操作表示从连接“左侧”的表/行源返回行,即使在“右侧”的表/行源中找不到匹配的行。表格的顺序实际上只在 LEFT|RIGHT [OUTER] JOIN 方面很重要。 ,就哪个表应该在“左侧”而言。与 [INNER] JOIN ,表的顺序不会影响结果集。

关于MySQL 从子查询中提取列以将其附加到主列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24564660/

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