这个查询不是合法的语法,我试图理解编写它的有效方法是什么。这就是我所拥有的:
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
值进行比较。有没有正确的方法来写这个?
答案 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
应该运行类似的查询。但是,这是否返回您期望实现的结果集,这实际上取决于您尝试返回的结果。如果没有规范(除了一些无效的查询语法),我们只是在猜测。