MySQL-无法在左连接和2个不同的选择范围内检索最大值
我使用的是MySQL5.6,我有两个表对它们进行了简化,将列的数量减少到与这个问题有关的程度,而今天的查询使用左连接来选择行 以下是测试您的解决方案的方法: 表“查询结果” 表“客户电子邮件” 我当前的查询成功地获取了给定查询\u id=2和给定客户\u id=12以及一些其他次要约束(如datecol>30)的所有查询结果MySQL-无法在左连接和2个不同的选择范围内检索最大值,mysql,sql,mysql-5.6,Mysql,Sql,Mysql 5.6,我使用的是MySQL5.6,我有两个表对它们进行了简化,将列的数量减少到与这个问题有关的程度,而今天的查询使用左连接来选择行 以下是测试您的解决方案的方法: 表“查询结果” 表“客户电子邮件” 我当前的查询成功地获取了给定查询\u id=2和给定客户\u id=12以及一些其他次要约束(如datecol>30)的所有查询结果 SELECT qr.query_result_id, qr.query_id, qr.author FROM
SELECT
qr.query_result_id,
qr.query_id,
qr.author
FROM
query_results qr
LEFT JOIN
customers_emails coe
ON
qr.author = coe.author AND
coe.customer_id = 12
WHERE
qr.query_id = 2 AND
qr.datecol >= 30 AND
qr.author IS NOT NULL
AND qr.author NOT IN (
SELECT author
FROM customers_emails
WHERE
(
customer_id = 12 AND
email_nb = 3
)
)
GROUP BY
qr.author
ORDER BY
qr.query_result_id ASC
LIMIT
2
上述查询非常有效,我很满意,并给出:
今天,我的输出是:
+-------------------+-----------------+--------------+
| query_result_id | query_id | author |
+-------------------+-----------------+--------------+
| 102 | 2 | emily |
+-------------------+-----------------+--------------+
+-------------------+-----------------+--------------+-----------------+-------------
| query_result_id | query_id | author | max_email_nb | ...
+-------------------+-----------------+--------------+-----------------+------------
| 102 | 2 | emily | 9 |
+-------------------+-----------------+--------------+-----------------+------------
现在我的目标和失败之处是:我只想在当前输出中添加一个名为max_email_nb的新列,该列将是**发送的最高电子邮件
由给定的客户提供\u id=12
在这个给定的查询上_id=2
从当前SQL输出到每一行的作者,在上面的示例中是emily,但可能会有更多行,而且无法预测:它来自当前查询**
我尝试使用MAX:
SELECT
qr.query_result_id,
qr.query_id,
qr.author,
MAX(coe.email_nb) as max_email_nb
FROM
query_results qr
LEFT JOIN
customers_emails coe
ON
qr.author = coe.author AND
coe.customer_id = 12
WHERE
qr.query_id = 2 AND
qr.datecol >= 30 AND
qr.author IS NOT NULL
AND qr.author NOT IN (
SELECT author
FROM customers_emails
WHERE
(
customer_id = 12 AND
email_nb = 3
)
)
GROUP BY
qr.author
ORDER BY
qr.query_result_id ASC
LIMIT
2
今天,我的输出是:
+-------------------+-----------------+--------------+
| query_result_id | query_id | author |
+-------------------+-----------------+--------------+
| 102 | 2 | emily |
+-------------------+-----------------+--------------+
+-------------------+-----------------+--------------+-----------------+-------------
| query_result_id | query_id | author | max_email_nb | ...
+-------------------+-----------------+--------------+-----------------+------------
| 102 | 2 | emily | 9 |
+-------------------+-----------------+--------------+-----------------+------------
max_email_nb中的值不正确:根据我的目标,我希望max_email_nb的值等于1,而不是9。我期望的结果是:
+-------------------+-----------------+--------------+-----------------+-------------
| query_result_id | query_id | author | max_email_nb | ...
+-------------------+-----------------+--------------+-----------------+------------
| 102 | 2 | emily | 1 |
+-------------------+-----------------+--------------+-----------------+------------
事实上,我想为我的SQL查询输出的每个查询结果检索,查询id 2上给定客户id 12发送给作者的最高电子邮件来自当前SQL查询,它是emily
那么这个不正确的9值是从哪里来的呢?它来自此输入行:
+-------------------+-----------------+--------------+-----------+-------------+
| customer_email_id | query_result_id | customer_id | author | email_nb |
+-------------------+-----------------+--------------+-----------+-------------+
| 14 | 104 | 12 | emily | 9
。。。因此它与查询结果id=104相关联,查询结果id=104本身在这里定义:
+-----------------------------+------------+--------------+-----------
| query_result_id | query_id | author | datecol
+-----------------------------+------------+--------------+-----------
| 104 | 4 | emily | 120
…所以查询id=4!但正如我在定义我的目标时所说的,我正在寻找与query_id=2相关的东西,这就是为什么我不应该得到9,而应该得到值1
这里有一把小提琴来测试您的解决方案:
我尝试了子查询,尝试了内部联接…但没有任何效果。看起来ON语句中缺少一个子句。这样行吗
SELECT
qr.query_result_id,
qr.query_id,
qr.author,
MAX(coe.email_nb) as max_email_nb
FROM
query_results qr
LEFT JOIN
customers_emails coe
ON
qr.author = coe.author AND
qr.query_result_id = coe.query_result_id
WHERE
qr.query_id = 2 AND
qr.datecol >= 30 AND
qr.author IS NOT NULL
AND qr.author NOT IN (
SELECT author
FROM customers_emails
WHERE
(
customer_id = 12 AND
email_nb = 3
)
)
GROUP BY
qr.author
ORDER BY
qr.query_result_id ASC
LIMIT
2
看起来您在ON语句中缺少了一个子句。这样行吗
SELECT
qr.query_result_id,
qr.query_id,
qr.author,
MAX(coe.email_nb) as max_email_nb
FROM
query_results qr
LEFT JOIN
customers_emails coe
ON
qr.author = coe.author AND
qr.query_result_id = coe.query_result_id
WHERE
qr.query_id = 2 AND
qr.datecol >= 30 AND
qr.author IS NOT NULL
AND qr.author NOT IN (
SELECT author
FROM customers_emails
WHERE
(
customer_id = 12 AND
email_nb = 3
)
)
GROUP BY
qr.author
ORDER BY
qr.query_result_id ASC
LIMIT
2
我在小提琴上试过,效果很好 你也可以试试这个
SELECT
qr.query_result_id,
qr.query_id,
qr.author,
MAX(coe.email_nb) as max_email_nb
FROM
query_results qr
LEFT JOIN
customers_emails coe
ON
qr.author = coe.author
and coe.customer_id = 12
and qr.query_result_id = coe.query_result_id
WHERE
qr.query_id = 2 AND
qr.datecol >= 30 AND
qr.author IS NOT NULL
AND qr.query_result_id NOT IN (
SELECT query_result_id
FROM customers_emails
WHERE
(
customer_id = 12 AND
email_nb = 3
)
)
GROUP BY
qr.author
ORDER BY
qr.query_result_id ASC
LIMIT
20
我在小提琴上试过,效果很好 你也可以试试这个
SELECT
qr.query_result_id,
qr.query_id,
qr.author,
MAX(coe.email_nb) as max_email_nb
FROM
query_results qr
LEFT JOIN
customers_emails coe
ON
qr.author = coe.author
and coe.customer_id = 12
and qr.query_result_id = coe.query_result_id
WHERE
qr.query_id = 2 AND
qr.datecol >= 30 AND
qr.author IS NOT NULL
AND qr.query_result_id NOT IN (
SELECT query_result_id
FROM customers_emails
WHERE
(
customer_id = 12 AND
email_nb = 3
)
)
GROUP BY
qr.author
ORDER BY
qr.query_result_id ASC
LIMIT
20
这应该给你你想要的,没有不确定性的限制逻辑 你可以看一看 其他信息: 之所以使用9而不是1,是因为左连接条件不够 您只需在两列中匹配作者即可加入,但emily还有一个条目的email_nb等于9
为了得到正确的结果,您还必须基于查询结果ID进行联接,以便将emily限制为仅为102的查询结果。这应该会提供您想要的结果,而不需要非确定性限制逻辑 你可以看一看 其他信息: 之所以使用9而不是1,是因为左连接条件不够 您只需在两列中匹配作者即可加入,但emily还有一个条目的email_nb等于9
为了得到正确的结果,您还必须根据查询结果ID加入,以便将emily限制为仅为102的查询结果。注释不用于扩展讨论;这段对话已经结束。检查小提琴-@AnkitBajpai我会感谢的。上面的查询非常有效-不!由于错误使用GROUP BY,该查询是不确定的。如果它返回预期的结果,那么您就是幸运的。请参见,无关的更改如何导致不同的结果。你没有解释为什么查询结果id应该是102而不是103。要求基于此查询的任何解决方案都没有多大意义。嗨@PaulSpiegel,我做了很多检查,它在mysql 5.6上确实有效。似乎GroupBy出现了问题,我的sql在5.7之后对此进行了更改…也许这就是你所说的?我现在读你的提琴。评论不是为了长时间的讨论;这段对话已经结束。检查小提琴-@AnkitBajpai我会感谢的。上面的查询非常有效-不!由于错误使用GROUP BY,该查询是不确定的。如果它返回预期的结果,那么您就是幸运的。请参见,无关的更改如何导致不同的结果。你没有解释为什么查询结果id应该是102而不是103。要求基于此查询的任何解决方案都没有多大意义。嗨@PaulSpiegel,我做了很多检查,它在mysql 5.6上确实有效。似乎GroupBy出现了问题,我的sql在5.7之后对此进行了更改…也许这就是你所说的?UPD:我在聊天室里读了讨论,看来我的建议错了。考虑如何重写它。让我试试我的提琴让我消化/确保它:我不认为这个查询是正确的,因为逻辑是错误的
sed on LIMIT或TOP不是确定性的。让我解释一下,我想要查询id=2的所有查询结果,如果查询结果的作者从未收到过客户的电子邮件,那么这很简单hehe/它正在工作,我检查过,或者如果他已经收到了客户的电子邮件,那么邮件不应该是email\u nb=3UPD:我已经在聊天中阅读了讨论,看起来我的建议是错误的。考虑如何重写它。让我试试我的小提琴让我消化/确保它:我不认为这个查询是正确的,因为基于LIMIT或TOP的逻辑是不确定的。让我解释一下,我想要查询id为2的所有查询结果,其中查询结果的作者要么从未收到过客户的电子邮件,要么从未收到过客户的电子邮件,这是一个简单的例子hehe/它正在工作,我检查过,或者如果他已经收到了客户的电子邮件,那么电子邮件就不应该是email\u nb=3Hi bhunnesh:与Sergey的评论相同:你关于公平的建议几乎100%正确..我尝试了很多案例,但它总是有效…一个不起作用的案例是,我在customer\u email\u id=13上设置了email\u nb=3,因为它与…email\u nb=3中的where子句冲突。它应该返回到另一个查询结果,并给我来自12、102、12,‘emily’,0的值0;嗨@Mathieu,谢谢你的建议,我已经更新了我的答案,请检查我会做最后检查,但我认为这是正确的!最大的诀窍是你替换了,qr.author不在,qr.query\u result\u id不在,感觉方法正确是的,正确等等,我会在19小时内给你分数,只有这样才能允许赏金点Shi Bhugnesh:与Sergey的评论相同:你关于公平的建议几乎100%正确..我试过很多案例,它总是有效…一个不起作用的案例是我在customer_email_id=13上设置了email_nb=3,因为它与不在…email_nb=3中的where子句冲突。它应该返回到另一个查询结果,并给我来自12、102、12,‘emily’,0的值0;嗨@Mathieu,谢谢你的建议,我已经更新了我的答案,请检查我会做最后检查,但我认为这是正确的!最大的诀窍是,你替换了,qr.author不在,qr.query\u result\u id不在,感觉是正确的方法是正确的,我会在19小时内给出分数,这才允许悬赏点Hanks。你的链接不起作用,但我复制粘贴了你的答案:它确实起作用。但与@Sergey相同:如果我将电子邮件\u nb的值设为13、103、12、'emily',3,则根本没有结果->请参见。我应该从这行中得到max\u email\u nb=0,值12、102、12,‘emily’,0@Mathieu好的,看起来你实际上在考虑问题的查询结果id。我的修改答案怎么样?谢谢。你的链接不起作用,但我复制粘贴了你的答案:它确实起作用。但与@Sergey相同:如果我将电子邮件\u nb的值设为13、103、12、'emily',3,则根本没有结果->请参见。我应该从这行中得到max\u email\u nb=0,值12、102、12,‘emily’,0@Mathieu好的,看起来你实际上在考虑问题的查询结果id。我修改过的答案怎么样?