2015-12-31 3 views
0

Предположим, у меня есть таблица TABLE:Как я могу выполнить этот основной запрос таблицы в PHP?

NAME ID ... 
m -1 ... 
f -1 ... 
g -1 ... 
b -1 ... 
z -1 ... 

И я хочу, чтобы превратить его в:

NAME ID ... 
f  1 ... 
g  2 ... 
m  3 ... 
b -1 ... 
z -1 ... 

Вы, вероятно, получите идею:

  1. выбрать первые 3 строки из исходной таблицы (порядок сохранения)
  2. заказывать выбранные строки по NAME колонка.
  3. обновляет идентификаторы выбранных строк с их позицией в новой таблице (сохраняя оставшиеся невыбранные строки в их исходных положениях).

Так (m, f, g) получил сортируется (f, g, m) и (b, z) остались (b, z).

Вот как я пытаюсь сделать это в PHP:

$count = 0; 
$query = "UPDATE TABLE SET ID = $count:= $count + 1 ORDER by NAME DESC LIMIT 3"; 
mysqli_query($con, $query); 

Но я не думаю, что я могу просто идти вперед и увеличивать счетчик и сохранять свое значение, как это. Любой совет?

+0

Вы всегда можете просто использовать запрос выбора для запроса первых трех строк и получить имена только когда идентификатор в настоящее время не имеет значения. Затем просто отсортируйте массив, используя функцию sort(). После этого вызовите метод 'array_values ​​()', чтобы переустановить ключи массива. Теперь вы можете использовать цикл для структурирования ваших запросов. – kfirba

ответ

0

Вы можете попробовать это:

$limit = 3; 
for($count = 0 ; $count < $limit;$count++){ 
$query = "UPDATE TABLE SET ID = $count + 1 WHERE ID = '-1' ORDER by NAME DESC"; 
mysqli_query($con, $query); 
} 
$query = "UPDATE TABLE SET ID = '-1' WHERE ID > $limit ORDER by NAME DESC"; 
mysqli_query($con, $query); 

В приведенной выше логике:

В конечном цикле, все идентификаторы устанавливаются в $ ограничить Однако команда обновления outisde цикла будет установлен обратно идентификаторы до -1 снова

0

Во-первых, вы можете быстро запросить первые три строки в таблице и получить только свойство name и присвоить значение в массиве.

$sql = "select name from table order by name limit 3" 
$query = $mysqli->query($sql); 

Теперь давайте построим вспомогательный массив:

while ($row = $mysqli->fetch_assoc()) { 
    $a[] = $row['name']; 
} 

Теперь только структурировать запросы:

foreach($a as $id => $name) { 
    $query = "update table set id={$id+1} where name='$name' limit 1"; 
    // execute the query 
} 

Обратите внимание, что я предполагаю, что имя является уникальным, так что я добавил limit 1 директиву скажите, чтобы он остановился на поиске строк для обновления после того, как нашел строку.

Кроме того, не забудьте, что ключи массива считаются начиная с 0, поэтому мы добавляем 1 к $ id в цикле.

Могут быть более элегантные решения, но это довольно легко понять и использовать.

0

В MySQL:

SET @row_number = 0; 

update TABLE d 
join 
    (
    select 
      NAME, 
      @row_number:[email protected]_number+1 as ID, 
    from 
      (select NAME from TABLE limit 3) t 
    order by 
      NAME asc 
    ) s on s.NAME = d.NAME 
set d.ID = s.ID; 

SQLFiddle: http://sqlfiddle.com/#!9/dffecf/1

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

Для этого подхода могут потребоваться некоторые изменения синтаксиса в зависимости от вашего механизма БД. Делая это в SQL, мы делаем только один проход в БД. Не так много итерации в нескольких проходах с PHP, если вы только обновляете три записи, но если это 1000, и т. Д.

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