MySQL запрос на основе последовательного цикла в PHP - PullRequest
0 голосов
/ 13 марта 2012

У меня есть запрос MySQL, подобный этому

SELECT id,seq,text FROM table ORDER BY seq ASC;

ID | SEQ | текст
_ __ _ ____
1 | 1 | один
2 | 4 | четыре
3 | 6 | шесть

Но мне нужно составить таблицу вот так

ID | SEQ | текст
_ __ _ ____
1 | 1 | один
| 2 |
| 3 |
2 | 4 | четыре
| 5 |
3 | 6 | шесть

Я мог бы сделать это с несколькими запросами, но это было бы брутто. Я думаю, что это возможно с некоторым циклом в PHP. Дело в том, что мне нужно заполнить пустые строки только порядковым номером. Есть идеи?

Ответы [ 4 ]

0 голосов
/ 13 марта 2012

Сначала вам нужно создать временную таблицу, содержащую все числа:

CREATE TEMPORARY TABLE Numbers ( ID int NOT NULL );

Затем вы вводите числа, например, от 1 до 100:

DECLARE idx INT DEFAULT 100;
WHILE idx > 0 DO
  INSERT Numbers VALUES (idx);
  SET idx = idx - 1;
END WHILE;

После этого вы можете создать запрос, подобный этому:

SELECT * FROM Numbers
JOIN table on Numbers.ID = table.SEQ

Не забудьте уронить стол:

DROP TEMPORARY TABLE Numbers

О, и вы оборачиваете все это в хранимую процедуру.

Примечание: это всего лишь макет. Это может иметь синтаксические ошибки. В настоящее время у меня нет установки mysql.

0 голосов
/ 13 марта 2012

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

Я думаювозможно создать оператор SQL, который возвращает эти данные, но будет неэффективным при использовании функций.

0 голосов
/ 13 марта 2012
$data = getDataAsAnArray();
$newData = array();

for ( $i = 0; $i < count( $data ) - 1; $i++ )
{
    $newData[] = $data[ $i ];
    for ( $j = $data[ $i ][ "SEQ" ] + 1; $j < $data[ $i + 1 ][ "SEQ" ]; $j++ )
    {
        $newData[] = array( "ID" => "", "SEQ" => $j, "text" => "" );
    }
}

$newData[] = $data[ $i ];
0 голосов
/ 13 марта 2012

Получить максимальный последующий номер из Db

$query = SELECT max(seq) as max FROM table;
$result = mysql_query();
$row = mysql_fetch_array($result);
$max = $row['max'];

затем попробуйте цикл

"SELECT id,seq,text FROM table ORDER BY seq ASC";
for( loop for $seq)
{
   for($i=0;$i<$max;$i++)
   {
      if($i == $seq)
      {
         /put your display logic for 1 1 one,2 4 four, 3 6 six
      }
      else
      {
         //blank row
      }
   }
}

Выше приведен план вашего ответа. Я надеюсь, вы поймете идею.

ОБНОВЛЕНИЕ: Выбрать запись из этого запроса

$query2 = "SELECT id,seq,text FROM table ORDER BY seq ASC";
$result2 = mysql_query($query2);
$row2 = mysql_fetch_array($result2);
for($j=0;$j<mysql_num_rows($row2);$j)

Я объяснил здесь, что я имею в виду под for (цикл для $ seq)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...