2014-01-20 136 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