编写使用派生列和多个连接的MySQL查询的正确方法

时间:2016-07-07 21:54:12

标签: mysql

这个查询不是合法的语法,我试图理解编写它的有效方法是什么。这就是我所拥有的:

  SELECT a.*, b.id, lapsed FROM
    ( SELECT DATEDIFF(CURDATE(), MAX(day)) AS lapsed FROM c ) AS x 
  FROM first_table a
  INNER JOIN second_table b ON a.id = b.some_id
  INNER JOIN third_table c ON c.user_id = a.user_id
  WHERE a.some_col = 'm'
  AND b.num >= lapsed

正在加入三张桌子。通常情况下这很简单,但问题是WHERE子句的最后一部分,特别是b.num >= lapsed正在对derived值进行比较。有没有正确的方法来写这个?

2 个答案:

答案 0 :(得分:1)

没有测试过这个,但如果子查询是正确的,那么这应该可行。

我还假设问题示例中的'c'也指的是third_table而不是某些名为c的表/视图。

INNER JOIN到third_table被注释掉了,因为当你不使用它的任何字段时,它对于INNER JOIN表/视图几乎没用。好吧,它可以用来限制该表中的记录,但大多数情况下这样做是没用的。

SELECT a.*, b.id, x.lapsed 
FROM first_table a
INNER JOIN second_table b ON a.id = b.some_id
--INNER JOIN third_table c ON c.user_id = a.user_id
LEFT JOIN ( 
    SELECT DATEDIFF(CURDATE(), MAX(day)) AS lapsed 
    FROM third_table
) AS x ON (1=1)
WHERE a.some_col = 'm'
AND b.num >= x.lapsed;

答案 1 :(得分:0)

鉴于MAX()聚合,您似乎希望day的每个user_id值的最新third_table值。

为此,我们可以编写如下查询:

  SELECT c.user_id
       , DATEDIFF(CURDATE(),MAX(c.day)) AS lapsed
    FROM third_table c
   GROUP BY c.user_id

您可以将此查询的结果集用作另一个查询中的行源,方法是将该查询用作内联视图来代替表引用。 (MySQL将内联视图称为"派生表"。)

我们只是将该查询包装在parens中,并使用它代替我们通常会找到表引用的位置。需要为内联视图(派生表)分配别名。

例如:

 SELECT a.*
      , b.id
      , d.lapsed
   FROM first_table a
   JOIN second_table b
     ON b.some_id = a.id
   JOIN ( SELECT c.user_id
               , DATEDIFF(CURDATE(),MAX(c.day)) AS lapsed
            FROM third_table c
           GROUP BY c.user_id
        ) d
     ON d.user_id = a.user_id   
  WHERE a.some_col = 'm'
    AND b.num > d.lapsed

应该运行类似的查询。但是,这是否返回您期望实现的结果集,这实际上取决于您尝试返回的结果。如果没有规范(除了一些无效的查询语法),我们只是在猜测。