2015-11-25 3 views
0

У меня есть вопрос в PHP & Проект Mysql.Механизм заказа в 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; 

Так больше веса будет вниз и меньший вес будет вверх.

Теперь, В моем представлении У меня есть движение вверх и перемещение вниз по кнопкам, поэтому я могу повторно сортировать объекты проекта.

я во-первых, выбрать текущий вес элемента, затем выберите верхний вес элемента,

введите два запроса обновления для обмена веса между двумя рядами,

, но это не профессиональный путь, я дон 't хотел бы использовать четыре вопроса.

Мне нужно сделать это в одном запросе Вместо четырех запросов.

Помогите пожалуйста?

+1

Вы спрашиваете, как сделать одиночную вставку stmt для вышеуказанных 5? – Drew

ответ

0

Вот как я справился бы с этим, предполагая, что я понял вопрос.

Во-первых, я бы добавил столбец featureId в projects_features и сделал (projectId, featureId) составной первичный ключ. На самом деле это не к моему решению; это просто облегчает жизнь. Для следующей части вы должны иметь возможность ссылаться на отдельные записи в projects_features.

Далее, я бы кнопки Move заполнить массив в PHP, как

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

Наконец, я хотел бы сделать обновление с помощью функции PHP, которая инкапсулирует UPDATE заявления, как это:

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(); 
    } 
} 

Также обратите внимание, что я на самом деле не запустить этот код, и так делать не что он свободен от синтаксиса или других ошибок.

Я надеюсь, что это поможет.

Смежные вопросы