Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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 子查询的替代方法_Mysql_Sql - Fatal编程技术网

Mysql 子查询的替代方法

Mysql 子查询的替代方法,mysql,sql,Mysql,Sql,我使用的是MySQL5.1,有这样一个查询,有没有办法不使用子查询并获得相同的结果 SELECT oref.affiliate_id, ROUND(sum( oph.amount ) * 0.10 ,2) AS tsum FROM operators_referer AS oref LEFT JOIN operators_payments_history AS oph ON oref.operator_id = oph.operator_id WHERE oref.affiliate_id

我使用的是MySQL5.1,有这样一个查询,有没有办法不使用子查询并获得相同的结果

SELECT oref.affiliate_id, ROUND(sum( oph.amount ) * 0.10 ,2) AS tsum
FROM operators_referer AS oref 
LEFT JOIN operators_payments_history AS oph 
ON oref.operator_id = oph.operator_id
WHERE oref.affiliate_id = 28221
AND
(
    oph.date_paid > 
    (
        SELECT MAX(aph.date_paid) 
        FROM affiliates_payments_history AS aph 
        WHERE aph.operator_id = oref.affiliate_id
    )
    OR 
    (
        SELECT MAX(aph.date_paid)
        FROM affiliates_payments_history AS aph 
        WHERE aph.operator_id = oref.affiliate_id 
    ) 
    is NULL
)
试试这个:

  SELECT oref.affiliate_id, ROUND(sum( oph.amount ) * 0.10 ,2) AS tsum
    FROM operators_referer AS oref 
    LEFT JOIN operators_payments_history AS oph 
    ON oref.operator_id = oph.operator_id
   LEFT JOIN affiliates_payments_history AS aph ON aph.operator_id = oref.affiliate_id
    WHERE oref.affiliate_id = 28221
  GROUP BY oref.affiliate_id
  HAVING IFNULL(MAX(aph.date_paid),0 > oph.date_paid)
试试这个:

  SELECT oref.affiliate_id, ROUND(sum( oph.amount ) * 0.10 ,2) AS tsum
    FROM operators_referer AS oref 
    LEFT JOIN operators_payments_history AS oph 
    ON oref.operator_id = oph.operator_id
   LEFT JOIN affiliates_payments_history AS aph ON aph.operator_id = oref.affiliate_id
    WHERE oref.affiliate_id = 28221
  GROUP BY oref.affiliate_id
  HAVING IFNULL(MAX(aph.date_paid),0 > oph.date_paid)
没有试过,但我想这就是你要找的


没有尝试过,但我认为这就是您正在搜索的内容。

您是否尝试过
HAVING
子句

SELECT oref.affiliate_id, ROUND(sum( oph.amount ) * 0.10 ,2) AS tsum
FROM operators_referer AS oref 
LEFT JOIN operators_payments_history AS oph 
ON oref.operator_id = oph.operator_id
LEFT JOIN affiliates_payments_history AS aph
ON aph.operator_id = oref.affiliate_id
WHERE oref.affiliate_id = 28221
GROUP BY oref.affiliate_id
HAVING MAX(aph.date_paid) > oph.date_paid OR MAX(aph.date_paid) IS NULL

您是否尝试过使用
HAVING
子句

SELECT oref.affiliate_id, ROUND(sum( oph.amount ) * 0.10 ,2) AS tsum
FROM operators_referer AS oref 
LEFT JOIN operators_payments_history AS oph 
ON oref.operator_id = oph.operator_id
LEFT JOIN affiliates_payments_history AS aph
ON aph.operator_id = oref.affiliate_id
WHERE oref.affiliate_id = 28221
GROUP BY oref.affiliate_id
HAVING MAX(aph.date_paid) > oph.date_paid OR MAX(aph.date_paid) IS NULL

您需要的是一个简单的
JOIN
逻辑

像这样:

SELECT oref.affiliate_id, ROUND(sum( oph.amount ) * 0.10 ,2) AS tsum
FROM operators_referer AS oref 
     LEFT JOIN operators_payments_history AS oph 
            ON oref.operator_id = oph.operator_id
     LEFT JOIN affiliates_payments_history AS aph
            ON aph.operator_id = oref.affiliate_id
WHERE oref.affiliate_id = 28221
AND ( oph.date_paid > MAX(aph.date_paid)
OR MAX(aph.date_paid) IS NULL)    
GROUP BY oref.affiliate_id;
查询的基本意思是“将aph和oph表连接到oref,仅在oref.affiliate_id的范围内应用max函数,并查找适用条件的行”


在MySQL手册中了解更多关于
JOIN
LEFT JOIN
功能的信息是明智的,您需要的是一个简单的
JOIN
逻辑

像这样:

SELECT oref.affiliate_id, ROUND(sum( oph.amount ) * 0.10 ,2) AS tsum
FROM operators_referer AS oref 
     LEFT JOIN operators_payments_history AS oph 
            ON oref.operator_id = oph.operator_id
     LEFT JOIN affiliates_payments_history AS aph
            ON aph.operator_id = oref.affiliate_id
WHERE oref.affiliate_id = 28221
AND ( oph.date_paid > MAX(aph.date_paid)
OR MAX(aph.date_paid) IS NULL)    
GROUP BY oref.affiliate_id;
查询的基本意思是“将aph和oph表连接到oref,仅在oref.affiliate_id的范围内应用max函数,并查找适用条件的行”


明智的做法是在MySQL手册中了解更多关于
JOIN
LEFT JOIN
功能的信息

不要这样做 如果表的索引正确,并且数据库结构合理,那么几乎可以肯定的是,最好将其保留在子查询中。根据你的评论,这似乎会简化和加快事情的发展——但事实并非如此。对于非子查询表单,解析器不一定能做得更好。子查询的清晰性,以及为不使用子查询而重新编写的查询的复杂性,表明这不是一个值得追求的目标

你需要知道这是否可以做到?它可以:
对CS.stackexchange问题的回答说明了如何做到这一点,一些人指出,没有任何方法可以使子查询不能作为基于联接的查询编写,并且没有可能的集合差异。这意味着有一种方法可以简化它,一些指向算法方法的链接也被链接到了。

不要这样做 如果表的索引正确,并且数据库结构合理,那么几乎可以肯定的是,最好将其保留在子查询中。根据你的评论,这似乎会简化和加快事情的发展——但事实并非如此。对于非子查询表单,解析器不一定能做得更好。子查询的清晰性,以及为不使用子查询而重新编写的查询的复杂性,表明这不是一个值得追求的目标

你需要知道这是否可以做到?它可以:

对CS.stackexchange问题的回答说明了如何做到这一点,一些人指出,没有任何方法可以使子查询不能作为基于联接的查询编写,并且没有可能的集合差异。这意味着有一种方法可以简化它,并且可以链接到算法方法的一些链接。

-1您使用子查询时,他会询问一个不使用one的答案您需要ifnull吗?如果它是一个左连接,它是否返回整个oref表,以及右表中匹配的所有记录,而不管它们是否为null?但至少,子查询只使用一次。这是对问题版本的改进;IMO不需要-1。是的,但我不能删除它,因为条件检查不是针对相等,而是针对>,如果是针对相等,则可以加入that@glglgl你说得有道理,虽然他说没有子查询,但我会把我的-1倒过来,因为我想你使用子查询有点苛刻,他要求的答案不使用one。你需要ifnull吗?如果它是一个左连接,它是否返回整个oref表,以及右表中匹配的所有记录,而不管它们是否为null?但至少,子查询只使用一次。这是对问题版本的改进;IMO不需要-1。是的,但我不能删除它,因为条件检查不是针对相等,而是针对>,如果是针对相等,则可以加入that@glglgl你说得有道理,尽管他没有提出任何疑问,我将颠倒我的-1,因为我认为这有点苛刻。你能给出一个数据和预期结果的例子吗?你可以使用
使用(operator\u id)
@glglglgl,而不是在oref.operator\u id=oph.operator\u id上使用
,这不会改变任何东西。关于这个问题,不是这样的,对吧。这就是为什么我选择评论而不回答。Bit它提高了可读性。@David Manheim,这是一个复杂更新的一部分,性能是一个问题,但我想知道的不止这些。你能给出一个数据和预期结果的例子吗?你可以使用
来代替oref.operator\u id=oph.operator\u id
,而不是使用
来使用(operator\u id)
@glglglgl这不会改变任何事情..与问题无关,对吧。这就是为什么我选择评论而不回答。Bit它提高了可读性。@David Manheim,这是一个复杂更新的一部分,性能是一个问题,但不仅仅是我想知道的。这给了我一个未知列“max_aph”,不知为什么别名在下面不起作用。知道吗?这给了我一个未知的专栏“max_aph”,不知什么原因,下面的别名不起作用。你知道吗?当运行你的查询时,我得到了一个“无效使用组函数”错误,我试图安排它,但仍然没有好结果,有什么提示吗?@Juanma-你试过从
WHERE
部分删除
或f.affiliate\u id
吗?那么我将如何获取特定id的信息?当运行你的查询时,我得到了一个“无效使用组函数”错误,我尝试过对其进行安排,但仍然没有效果,有什么提示吗?@Juanma-你试过从
WHERE
部分删除
oref.affiliate\u id
吗?那么我该如何获得特定id的信息呢?拥有只是创建子查询的一种偷偷摸摸的方法。它确实消除了语法,但我认为数据库引擎仍然将其视为子查询——当然,这可能是错误的