0

これは私のテーブルですlikes

id  type parent country votes
1   1   0       US      0 # This value need to be 9
2   2   1       US      6
19  3   1       US      3
3   3   2       US      3
7   3   2       US      3
4   10  3       US      1
5   10  3       US      1
6   10  3       US      1
10  10  7       US      1
9   10  7       US      1
8   10  7       US      1
20  10  19      US      1
21  10  19      US      1
22  10  19      US      1

テーブル内の総投票数を更新するスクリプトを実行しています。

ここで、type 10 updates type 3type 3 updates 2 and 1type 2 updates 1

私のスクリプトを実行すると、それがどのように機能するかがわかります。

ここでは、 id 19 にする必要があり、スクリプトを実行するたびに更新しないでください。他の人はしません。しかし、値を2倍にせずに1を更新する方法が見つかりません。

方法を見つけるのを手伝ってくれませんか?

スクリプトはこちら。

$conn = connect();

$what = 10;
$pathType = 15;

while ( $pathType >=2 )
{
$stmt = $conn->prepare("select max(type) as type from likes where type < :type and country = 'US'");
$stmt->bindParam(':type', $pathType);
$stmt->execute();
$pathData = $stmt->fetch();
$pathType = $pathData['type'];
echo 'Path Type is '.$pathType.'<br>';

    $stmt = $conn->prepare("select sum(votes) as votes, parent as parent from likes where type=:type group by parent");
    $stmt->bindParam(':type', $pathData['type']);
    $stmt->execute();
    $rows = $stmt->rowCount();

        while( $row = $stmt->fetch() ) {
            echo $row['parent']." ".$row['votes'];
            echo "<br>";

            if($row['parent'] == 1){
            echo 'Passed Level 1<br>';
                $wtf = $conn->prepare("update likes set votes=votes+:votes where id=:parent");
            }else{
                $wtf = $conn->prepare("update likes set votes=:votes where id=:parent");
            }

            $wtf->bindParam(':votes', $row['votes']);
            $wtf->bindParam(':parent', $row['parent']);
            $wtf->execute();
        }
    echo "-----------------------------------------------<br>";
}

必要な場合に備えて、次のように作成します。

-- --------------------------------------------------------
-- Host:                         127.0.0.1
-- Server version:               5.5.25 - MySQL Community Server (GPL)
-- Server OS:                    Win64
-- HeidiSQL version:             7.0.0.4053
-- Date/time:                    2013-05-17 14:41:11
-- --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET FOREIGN_KEY_CHECKS=0 */;

-- Dumping database structure for wwp-db
DROP DATABASE IF EXISTS `wwp-db`;
CREATE DATABASE IF NOT EXISTS `wwp-db` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `wwp-db`;


-- Dumping structure for table wwp-db.likes
DROP TABLE IF EXISTS `likes`;
CREATE TABLE IF NOT EXISTS `likes` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `type` tinyint(1) DEFAULT '0',
  `parent` int(10) DEFAULT '0',
  `country` varchar(2) DEFAULT NULL,
  `votes` int(10) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4176 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

-- Dumping data for table wwp-db.likes: 14 rows
/*!40000 ALTER TABLE `likes` DISABLE KEYS */;
INSERT IGNORE INTO `likes` (`id`, `type`, `parent`, `country`, `votes`) VALUES
    (1, 1, 0, 'US', 9),
    (2, 2, 1, 'US', 6),
    (3, 3, 2, 'US', 3),
    (4, 10, 3, 'US', 1),
    (5, 10, 3, 'US', 1),
    (6, 10, 3, 'US', 1),
    (7, 3, 2, 'US', 3),
    (8, 10, 7, 'US', 1),
    (9, 10, 7, 'US', 1),
    (10, 10, 7, 'US', 1),
    (19, 3, 1, 'US', 3),
    (20, 10, 19, 'US', 1),
    (21, 10, 19, 'US', 1),
    (22, 10, 19, 'US', 1);
/*!40000 ALTER TABLE `likes` ENABLE KEYS */;
/*!40014 SET FOREIGN_KEY_CHECKS=1 */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
4

1 に答える 1

0

likes の最初の行は、最初のインスタンスで if ステートメントの条件を満たしていません。

if($row['parent'] == 1){
  echo 'Passed Level 1<br>'; //This doesn't apply to row with id 1 - but does to one with parent id 1
  $wtf = $conn->prepare("update likes set votes=votes+:votes where id=:parent");
}else{
 //Does not affect row with id 1 as it has a parent of 0
 $wtf = $conn->prepare("update likes set votes=:votes where id=:parent");
}

編集:わかりましたので、これを実行します:および行0を更新します

$wtf = $conn->prepare("update likes set votes=votes+:votes where id=:parent");

親 ID が 1 の行に到達すると、

値に設定されていない投票に追加するように指示しています。更新するたびに、自然に追加されます。特定の値で停止したい場合は、クエリまたはコードに別の条件を追加します

于 2013-05-17T09:24:20.683 に答える