2017-02-23 15 views
1

には影響しません「IN」:MySQLは次のように私は、mysqlのテーブルを持っている重複した値に

+----+---------+---------+-------+ 
| id | column1 | column2 | count | 
+----+---------+---------+-------+ 
| 1 |  23 |  50 | 10 | 
+----+---------+---------+-------+ 

し、クエリを次のように

UPDATE `count_table` 
SET `count`=`count`-1 
WHERE (`column1`, `column2`) 
IN ((23,50),(23,50)) 

私はクエリを実行すると、私はの価値を期待'count'列は8になりますが、結果は9です。

期待どおりにクエリを実行できる代替クエリはありますか。

注:私は、カウントのような文を変更したくない=カウント2

をコードスニペットが

// this array is program generated ,it can hold max 300 values 
$a=["(23,50)","(23,50)","(24,13)","(30,23)","(32,52)"]; 

$in_values = "("; 

foreach ($a as $value) 
{ 
    $in_values .= $value . ","; 
} 

$in_values = substr($in_values, 0, -1) . ")"; 

$update_query = "UPDATE `count_table` SET `count`=`count`-1 WHERE (`column1`, `column2`) IN " . $in_values; 
+0

SQLは、手続き型言語ではありません。このステートメントを2回呼び出す必要があります。 – GurV

+0

なぜ 'set' count' = 'count'-2'だけではないのですか? –

+0

IN問合せに他の列ペアが2つ減ることを避けるため、 – Onx

答えて

0

一つの方法は、ペアを格納する一時テーブルを使用することです。その後、UPDATE ... JOINステートメントを実行できます。

drop temporary table if exists tmp; 
create temporary table tmp (column1 int, column2 int); 
insert into tmp(column1, column2) values (23,50),(23,50),(24,13),(30,23),(32,52); 

update count_table t1 
join (
    select column1, column2, count(*) as `count` 
    from tmp 
    group by column1, column2 
) t2 using (column1, column2) 
set t1.count = t1.count - t2.count; 

デモ:http://rextester.com/NRXM35380

注:レプリケーションを使用する場合は、これをお読みください:Replication and Temporary Tables

+0

ありがとう、 、 – Onx

+0

最適なものは教えていただけますか? 上記のソリューションを使用していますか? または forループとinside forループを使用すると、1つの更新文が実行されます – Onx

+0

@Onxおそらくこれです。ベンチマークを実行するかどうかだけは確信できます。 update文を一度準備してループで実行することは、十分速い可能性があります。その場合、私は最も簡単な解決策をとるでしょう。 –

1

与える

UPDATE count_table SET count=count-1 WHERE coloumn1 in (23,50) OR coloumn2 IN (23,50) 

、これを試してみてください以下の通りであります試してみてください。これはうまくいくはずです。あなたはこのように試すことができ

EDIT

$a = ["23,50", "23,50", "24,13", "30,23", "32,52"]; 
$column1 = $column2 = []; 
foreach ($a as $v){ 
    $temp = explode(',',$v); 
    $column1[] = $temp[0]; 
    $column2[] = $temp[1]; 
} 
$update_query = "UPDATE `count_table` SET `count`=`count`-1  
WHERE coloumn1` IN (".implode(',', $column1).") 
OR coloumn2` IN (".implode(',', $column2).")"; 
+0

coloumn1、coloumn2、個別にはありません – Onx

+0

あなたの構文によると、それは不可能です、私はあなたに同じものの代替を与えるでしょう – rahulsm

+0

IN((23,50)、(23,50)) 上記の値はデータベースからフェッチすることによって配列に格納されます、 私はちょうどループthrogh配列を構築し、SQLクエリ – Onx

関連する問題