0

簡単にするために、「3」と呼ばれるテーブルのいくつかの行を更新する必要があります。

このクエリで更新する列を選択します。

SELECT one.id
FROM one 
    JOIN `two` ON ( one.id = two.page )
    JOIN `three` ON ( one.id = three.item )
WHERE two.level = 1
    AND  two.item = (SELECT item FROM two WHERE page = 5 AND level = 1 ) 
    AND three.position > (SELECT position FROM three WHERE item = 5 ) 
ORDER BY three.position

ここで、取得した ID を使用して更新クエリを呼び出します。

サブクエリを排除する機会はありますか?

編集(メラニーのコメントの後):

テーブル「1」:

|id|text|

テーブル「2」:

|id|item|page|level|

表「3」:

|item|position|

したがって、クエリを実行すると

SELECT item FROM two WHERE page = 5 AND level = 1

f.ex 1 を返し、最後の WHERE 句は次のようになります。

two.item = 1 AND two.level = 1

これは次と同じではありません:

two.level = 1 and two.page = 5

私はテーブル1を持っています - one.idを持ついくつかのテキスト。私のアイテム (f.ex. id = 5) よりも高い位置にあるテーブル 3 のすべてのアイテムを更新する必要があります。ただし、これらのアイテムには、表 2 にも同じ two.item が含まれている必要があります。ここで、two.page = one.id および level = 1 です。

説明が下手ですみません。

4

2 に答える 2

1

@TheVedge は興味深いソリューションですが、クエリと同じ結果は得られません

ビューでも同じテーブルを複製しないようにすることをお勧めしますので、少し修正してください

もう一つの修正は three2.item=5

サブクエリ limit 0,1 で使用することをお勧めしますので、複数の要素を返さないでください

SELECT one.id
FROM one 
   JOIN `two` AS TWO2 ON (two2.page = 5 AND two2.level = 1)
   JOIN `two` ON ( one.id = two.page AND two.item = two2.item )
   JOIN `three` AS THREE2 ON ( three2.item = 5)
   JOIN `three` ON ( one.id = three.item AND three.position > three2.position)
WHERE two.level = 1
ORDER BY three.position

このクエリで同じことを行っているわけではないことに注意してください。

これを試して

 CREATE TABLE `one` (
    `id` INT(10) NULL DEFAULT NULL,
`text` VARCHAR(50) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

_

CREATE TABLE `three` (
`item` INT(10) NULL DEFAULT NULL,
`position` INT(10) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

_

CREATE TABLE `two` (
`id` INT(10) NULL DEFAULT NULL,
`item` INT(10) NULL DEFAULT NULL,
`page` INT(10) NULL DEFAULT NULL,
`level` INT(10) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

_

    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (1, 1, 5, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (3, 3, 5, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (4, 4, 5, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (5, 5, 5, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (6, 6, 5, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (7, 7, 5, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (8, 8, 5, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (9, 9, 5, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (2, 2, 5, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (10, 2, 1, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (11, 1, 1, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (13, 3, 1, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (14, 4, 1, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (15, 5, 1, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (16, 6, 1, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (17, 7, 1, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (18, 8, 1, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (19, 9, 1, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (20, 2, 2, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (21, 1, 2, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (23, 3, 2, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (24, 4, 2, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (25, 5, 2, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (26, 6, 2, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (27, 7, 2, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (28, 8, 2, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (29, 9, 2, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (30, 2, 3, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (31, 1, 3, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (33, 3, 3, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (34, 4, 3, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (35, 5, 3, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (36, 6, 3, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (37, 7, 3, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (38, 8, 3, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (39, 9, 3, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (40, 2, 4, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (41, 1, 4, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (42, 3, 4, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (43, 4, 4, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (44, 5, 4, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (45, 6, 4, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (46, 7, 4, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (47, 8, 4, 1);
    INSERT INTO `two` (`id`, `item`, `page`, `level`) VALUES (48, 9, 4, 1);

-

    INSERT INTO `three` (`item`, `position`) VALUES (1, 1);
    INSERT INTO `three` (`item`, `position`) VALUES (2, 1);
    INSERT INTO `three` (`item`, `position`) VALUES (3, 1);
    INSERT INTO `three` (`item`, `position`) VALUES (4, 1);
    INSERT INTO `three` (`item`, `position`) VALUES (5, 0);
    INSERT INTO `three` (`item`, `position`) VALUES (6, 1);
    INSERT INTO `three` (`item`, `position`) VALUES (7, 1);
    INSERT INTO `three` (`item`, `position`) VALUES (8, 1);
    INSERT INTO `three` (`item`, `position`) VALUES (9, 1);
    INSERT INTO `three` (`item`, `position`) VALUES (10, 1);
    INSERT INTO `three` (`item`, `position`) VALUES (11, 1);
    INSERT INTO `three` (`item`, `position`) VALUES (12, 1);

_

    INSERT INTO `one` (`id`, `text`) VALUES (1, 'A');
    INSERT INTO `one` (`id`, `text`) VALUES (2, 'B');
    INSERT INTO `one` (`id`, `text`) VALUES (3, 'C');
    INSERT INTO `one` (`id`, `text`) VALUES (4, 'D');
    INSERT INTO `one` (`id`, `text`) VALUES (5, 'E');
    INSERT INTO `one` (`id`, `text`) VALUES (6, 'F');
    INSERT INTO `one` (`id`, `text`) VALUES (7, 'G');

_

    SELECT 
  one.id, one.text
 ,two.id,two.item,two.page,two.level
 ,three.item,three.position
FROM one 
    JOIN `two` ON ( one.id = two.page )
   JOIN `three` ON ( one.id = three.item )
WHERE two.level = 1
   AND  two.item = (SELECT item FROM two WHERE page = 5 AND level = 1 limit 0,1 ) 
  AND three.position > (SELECT position FROM three WHERE item = 5 limit 0,1  ) 
 ORDER BY three.position




     SELECT    
 one.id, one.text
 ,two.id,two.item,two.page,two.level
 ,three.item,three.position
FROM one 
    JOIN `two` AS TWO2 ON (two2.page = 5 AND two2.level = 1)
    JOIN `two` ON ( one.id = two.page AND two.item = two2.item )
    JOIN `three` AS THREE2 ON ( three2.item = 5)
    JOIN `three` ON ( one.id = three.item AND three.position > three2.position)
 WHERE two.level = 1
 ORDER BY three.position

元のクエリを使用して、TheVedge ソリューションで特定の要素を選択したため、より多くのデータを結合しているため、選択した内容によって結果が異なります

別の有用な分析はhttp://dev.mysql.com/doc/refman/5.0/en/show-profile.htmlおよび Explainです。

Show Profile は、最初の実行時に元のクエリが実行することを示します

    Status      Duration
starting    0.000039
checking query cache for query  0.000144
Opening tables  0.000032
System lock 0.000007
Table lock  0.000061
init    0.000054
optimizing  0.000314
statistics  0.000021
preparing   0.000051
Creating tmp table  0.000084
executing   0.000004
Copying to tmp table    0.000063
optimizing  0.000008
statistics  0.000019
preparing   0.000009
executing   0.000004
Sending data    0.000054
optimizing  0.000008
statistics  0.000007
preparing   0.000009
executing   0.000003
Sending data    0.000126
Sorting result  0.000030
Sending data    0.000025
end 0.000004
removing tmp table  0.000011
end 0.000005
query end   0.000004
freeing items   0.000101
storing result in query cache   0.000008
logging slow query  0.000003
cleaning up 0.000006

提案されたクエリは

Status  Duration
starting    0.000036
checking query cache for query  0.000122
Opening tables  0.000030
System lock 0.000008
Table lock  0.000064
init    0.000046
optimizing  0.000028
statistics  0.000026
preparing   0.000072
Creating tmp table  0.000086
executing   0.000005
Copying to tmp table    0.001081
Sorting result  0.000040
Sending data    0.000056
end 0.000005
removing tmp table  0.000010
end 0.000005
query end   0.000004
freeing items   0.000108
storing result in query cache   0.000007
logging slow query  0.000003
cleaning up 0.000005

したがって、完全なデータがある場合は、両方のクエリの応答をより適切に評価することができます

于 2013-01-04T23:44:24.573 に答える
1

これらのサブクエリを結合で置き換えることができるはずです:

SELECT one.id
FROM one 
    JOIN `two2` ON (two2.page = 5 AND two2.level = 1)
    JOIN `two` ON ( one.id = two.page AND two.item = two2.item )
    JOIN `three2` ON ( three.item = 5)
    JOIN `three` ON ( one.id = three.item AND three.position > three2.position)
WHERE two.level = 1
ORDER BY three.position
于 2013-01-04T22:17:14.850 に答える