Mysql中的订购机制

时间:2015-11-25 20:39:17

标签: php mysql

我在PHP& Mysql项目。

简单地说,我有两个表项目和项目功能,

每个项目都有特定的功能。

CREATE TABLE projects (
   ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
   name varchar(255) NOT NULL
);


CREATE TABLE projects_features (
   projectId INT NOT NULL,
   name varchar(255) NOT NULL,
   value varchar(255) NOT NULL,
   weight INT NOT NULL
);

INSERT INTO projects VALUES (NULL,'project1');

INSERT INTO projects VALUES (NULL,'project2');

INSERT INTO projects_features VALUES (1,'Feature1','Feature1 Value',1);

INSERT INTO projects_features VALUES (2,'Feature2','Feature2 Value',2);

INSERT INTO projects_features VALUES (1,'Feature3','Feature3 Value',3);

INSERT INTO projects_features VALUES (2,'Feature4','Feature4 Value',4);

INSERT INTO projects_features VALUES (1,'Feature5','Feature5 Value',5);

我通过以下方式获取项目功能:

SELECT * FROM projects_features WHERE projectId = 1 ORDER BY weight ASC;

所以体重越大,体重越低。

现在, 在“我的视图”中,我向上移动并向下移动按钮,因此我可以重新排序项目功能。

我可以先选择当前项目的重量,然后选择上面的项目重量,

然后键入两个更新查询以交换两行之间的权重,

但这不是一种专业的方式,我不喜欢使用四种查询。

我需要在一个查询中执行此操作而不是四个查询。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

这是我如何解决这个问题,假设我已经理解了这个问题。

首先,我要向featureId添加projects_features列,并使(projectId, featureId)成为复合主键。这对我的解决方案来说实际上并非必要;它只是使其余部分更容易。对于下一部分,您需要能够在projects_features中引用单个记录。

接下来,我在PHP中使用Move按钮填充数组,例如

$update_list = array();
$update_list[i] = array(':project_id' => $proj_id,
                        ':feature_id' => $feat_id,
                        ':new_weight' => $weight);

最后,我通过封装UPDATE语句的PHP函数进行更新,如下所示:

function updateWeights($update_array, $dbh)
{
    $sql = 'UPDATE project_features
              SET weight = :new_weight
              WHERE projectId = :project_id
                AND featureId = :feature_id'
    $stmt = $dbh->prepare($sql);
    foreach ($update_array as $update_item)
    {
        $stmt->execute($update_item);
    }
}

注意我在这里使用PDO;它也可以用mysqli完成,虽然mysqli不支持命名绑定参数,所以语法会略有不同,比如

function updateWeights($update_array, $dbh)
{
    $sql = 'UPDATE project_features
              SET weight = ?
              WHERE projectId = ?
                AND featureId = ?'
    $stmt = $dbh->prepare($sql);
    foreach ($update_array as $update_item)
    {
        $stmt->bind_param('i', $update_item[':new_weight']);
        $stmt->bind_param('i', $update_item[':project_id']);
        $stmt->bind_param('i', $update_item[':feature_id']);
        $stmt->execute();
    }
}

另请注意,我实际上并没有运行此代码,因此不能表示它没有语法或其他错误。

我希望有所帮助。