2016-07-05 2 views
1

Это должен быть очень простой вопрос, но я не мог понять. В таблице mysql два столбца: questionNumber и rowNumber. Я хочу обновить rowNumber по номеру questionNumber. вот мой php, и проблема в запросе ("UPDATE Question SET rowNumber = ($x=$x+1) ORDER BY QuestionNumber"). Любой помощник, чтобы исправить это для меня?Как обновить rowNumber

<?php 

    $link = mysqli_connect($dbhost, $username, $dbpass, $database); 

    if (!$link) { 
     echo "Error: Unable to connect to MySQL." . PHP_EOL; 
     echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL; 
     echo "Debugging error: " . mysqli_connect_error() . PHP_EOL; 
     exit; 
    } 

    $x = 0; 
    $sql = "UPDATE Question SET rowNumber = ($x=$x+1) ORDER BY QuestionNumber"; 

    if ($link->query($sql) === TRUE) { 
     echo "Updated"; 
    } else { 
     echo "Error updating record: " . $link->error; 
    } 
    $link->close(); 
    ?> 
+0

'UPDATE .. ORDER BY'? Что это должно было делать? – FirstOne

+0

Да. У меня есть два столбца, и 'questionNumber' всегда меняется. также я хочу изменить 'rowNumber' на основе' questionNumber'. Благодарю. –

+1

Обновление idk с присоединением к производной таблице, которая извлекает выгоду из заказа. Почему вы все равно хотите это сделать, это [проблема XY] (http://xyproblem.info/) якобы. – Drew

ответ

1

Вот это визуальный я просто положить вместе. Представьте себе таблицу с городом и штатом, и, ну, колонну из розума!

Я хочу, чтобы обновить столбец ROWNUM, но только для строк с состоянием = Южная Каролина ... SC

И я хочу, порядок обновления, чтобы быть по названию города. И данные вставляются в физическом порядке изначально, чтобы показать, что это сработало, если имена городов SC не были первоначально вставлены в альфа-порядке.

Схема:

drop table if exists locat123; 
create table locat123 
( id int auto_increment primary key, 
    city varchar(100) not null, 
    state varchar(100) not null, 
    rownum int not null 
); 
insert locat123 (city,state,rownum) values 
('a1','NY',-1),('a2','NY',-1),('a3','NY',-1),('a4','NY',-1), 
('m1','MT',-1),('m2','MT',-1), 
('s8','SC',-1),('s2','SC',-1),('s4','SC',-1),('s1','SC',-1),('s11','SC',-1); 

Оператор Update с производной таблицы:

update locat123 l 
join 
( select l.id,l.city,@rn:[email protected]+1 as rown 
    from locat123 l 
    cross join (select @rn:=0) params 
    where l.state='SC' -- <==================== right there, update SC only 
    order by l.city -- By the way, 5 rows that are South Carolina (SC) in here 
) xDerived 
on l.id=xDerived.id 
set l.rownum=xDerived.rown; 
-- 5 rows updated 

Результаты:

select * from locat123 order by state,city; 

+----+------+-------+--------+ 
| id | city | state | rownum | 
+----+------+-------+--------+ 
| 5 | m1 | MT |  -1 | 
| 6 | m2 | MT |  -1 | 
| 1 | a1 | NY |  -1 | 
| 2 | a2 | NY |  -1 | 
| 3 | a3 | NY |  -1 | 
| 4 | a4 | NY |  -1 | 
| 10 | s1 | SC |  1 | 
| 11 | s11 | SC |  2 | 
| 8 | s2 | SC |  3 | 
| 9 | s4 | SC |  4 | 
| 7 | s8 | SC |  5 | 
+----+------+-------+--------+ 

Итак, почему производная таблица? Потому что нам нужно было ввести переменную для увеличения в качестве нашего счетчика. И мы использовали cross join с единственной целью получить эту переменную во всем. И после того, как производная таблица будет решена, мы сворачиваем ее результаты в обычный шаблон Update with a Join, который завернул его.

Естественно, поскольку пользователь FirstOne сказал, мы можем использовать Update ... order by в некоторых ситуациях. Выше было то, что я придумал для этого.

О, и только чтобы повторить, производные таблицы часто используются для очистки нашей пользовательской информации и ее сгибания в большую часть нашего запроса.

+0

Отличный ответ !!! :-D – Blank

+0

Вы тоже босс ... привязаны к +1 для вас. Кто на самом деле сосредоточился на своих вещах, пока я был где-то в SC. – Drew

+0

Большое спасибо. Я понимаю это. Он работает в sql. Теперь новая проблема заключается в том, как изменить ее на запрос в php. Потому что в моей таблице пользователь может изменить questionNumber (при удалении вопроса и добавить вопрос). Я хочу обновить весь столбец rowNumber на основе номера вопроса, и в это время rowNumber изменится. поэтому я хочу изменить rowNumber всякий раз, когда номер вопроса изменяется. Спасибо. –

1

Может быть, вы можете сделать это без $x, попробуйте следующее:

UPDATE t1 Question t1 
INNER JOIN (
    SELECT @rowno := @rowno + 1 AS rowno, QuestionNumber 
    FROM Question 
    CROSS JOIN (SELECT @rowno := 0) t 
    ORDER BY QuestionNumber 
) t2 
ON t1.QuestionNumber = t2.QuestionNumber 
SET t1.rowNumber = t2.rowno 
+0

после вытаскивания первого t1, это для работы sql отлично, но для php это не работает. Это делает мой номер всего 0. 0. –

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