2014-01-20 86 views
0

我需要SQL查询帮助:SQL子查询所有

UPDATE content_type_blog b 
LEFT JOIN node n 
ON n.nid = b.nid 
SET b.field_is_latest_value = 1 
WHERE n.nid IN (
    (
    SELECT nid 
    FROM node 
    GROUP BY uid 
    ORDER BY created DESC 
) 
); 

WHERE子句选择返回4012倍的结果,但在运行整个查询时更新124K结果,而不是限制它与那些在子查询中匹配的4012匹配。

此查询有意更新content_type_blog - 表列nid其中在节点表中创建的最高(最新)。

+0

让我们忘了问题的更新部分。你能构建一个能够返回所需结果的SELECT查询吗?如果没有,请考虑提供适当的DDL(和/或一个sqlfiddle)与期望的结果。另请注意,UPDATE语句上的OUTER JOIN很少。 – Strawberry

+0

SELECT nid FROM节点GROUP BY uid ORDER BY创建DESC;会返回neede结果集,但出于某种原因,我无法确定使用此数据集的WHERE子句允许UPDATE更新content_type_blog上的所有行,而不是限制为子查询返回的那些行。 –

+0

我怀疑你需要在2个条件加入该查询,如果你想要它限制4012更新到一个特定的组。 – Mihai

回答

1

您的子查询筛选出重复的nid值,但它仍然返回所有这些值。所以它不是一个过滤器。

在其他数据库中,您所要求的通常是使用像row_number()这样的窗口函数完成的。但MySQL不支持。相反,你可以使用过滤连接。

下面是一个例子。 SQL小提琴看起来很糟糕,所以我无法测试它,但我希望它能指引您朝着正确的方向发展。

create table table1 (col1 int, col2 bit, created datetime) 
insert table1 values 
    (1, 0, '2013-01-01'), 
    (1, 0, '2013-01-02'), 
    (1, 0, '2013-01-03'), 
    (2, 0, '2013-01-01'); 

update table1 
join (
     select col1 
     ,  max(created) as max_created 
     from table1 
     group by 
       col1 
     ) filter 
on  filter.col1 = table1.col1 
     and filter.max_created = table1.creatd 
set  col2 = 1 

select * 
from table1 
+0

使用ID代替col1 – Mihai

+0

@Mihai:谢谢,更新。没有使用'id',因为OP的'nid'显然不是唯一的。 – Andomar

+0

谢谢,这对解决方案有很大的帮助! –

0

也许问题是,你正在使用content_type_blog b LEFT JOIN,所以做你包括对结果查询content_typ_blog所有行。尝试使用INNER JOIN只更新您的子查询的行:

UPDATE content_type_blog b 
INNER JOIN node n 
ON n.nid = b.nid 
SET b.field_is_latest_value = 1 
WHERE n.nid IN (
    (
    SELECT nid 
    FROM node 
    GROUP BY uid 
    ORDER BY created DESC 
    LIMIT 1 
) 
); 
+0

这不起作用:MariaDB的[drupal的]> UPDATE content_type_blog b - > INNER JOIN节点n - ON n.nid> = b.nid - > SET b.field_is_latest_value = 1 - > WHERE n.nid IN( - >( - >选择NID - >从节点 - > GROUP BY UID - > ORDER BY创建DESC - >) - >); 查询OK,0行受影响(0.88秒) 匹配的行数:120340更改:0警告:0 –

+0

您确定子查询按您的要求做了吗?如果您只想通过'created'列创建最近一行,您必须限制为1 – carexcer

0

这似乎这样的伎俩:

UPDATE content_type_blog b 
LEFT OUTER JOIN node n 
ON n.nid = b.nid 
JOIN (
     SELECT DISTINCT nid, 
     MAX(created) AS max_created 
     FROM node 
     GROUP BY uid 
     ) filter 
ON  filter.nid = b.nid 
SET b.field_is_latest_value = 1; 
+0

'max_created'字段已定义,但从未使用,因此它不会影响查询。因为你在没有分组的情况下选择'nid',你的查询将会更新一个'uid'的随机'nid'。我会测试并尝试更多的解决方案:) – Andomar