Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-无法在左连接和2个不同的选择范围内检索最大值_Mysql_Sql_Mysql 5.6 - Fatal编程技术网

MySQL-无法在左连接和2个不同的选择范围内检索最大值

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

我使用的是MySQL5.6,我有两个表对它们进行了简化,将列的数量减少到与这个问题有关的程度,而今天的查询使用左连接来选择行

以下是测试您的解决方案的方法:

表“查询结果”

表“客户电子邮件”

我当前的查询成功地获取了给定查询\u id=2和给定客户\u id=12以及一些其他次要约束(如datecol>30)的所有查询结果

  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。我修改过的答案怎么样?