sql >> Database >  >> RDS >> Mysql

Specifieke maat maken

Ik begrijp uw vraag niet echt, maar hier is een voorbeeld van het opnieuw ordenen van een lijst...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(image CHAR(1) NOT NULL PRIMARY KEY 
,position INT NOT NULL
);

INSERT INTO my_table VALUES
('A',1),
('B',2),
('C',3),
('D',4),
('E',5),
('F',6);

Laten we zeggen dat we de afbeelding van positie 5 naar positie 2 willen slepen...

SET @old_position = 5;
SET @new_position = 2;

SELECT image
     , position old_order
     , ROUND(CASE WHEN position NOT BETWEEN LEAST(@old_position,@new_position) AND GREATEST(@old_position,@new_position) 
                  THEN position 
                  WHEN position = @old_position THEN @new_position
                  ELSE position+(((@new_position<@old_position)-.5)*2)
                  END 
            ,0) new_order 
  FROM my_table;

+-------+-----------+-----------+
| image | old_order | new_order |
+-------+-----------+-----------+
| A     |         1 |         1 |
| B     |         2 |         3 |
| C     |         3 |         4 |
| D     |         4 |         5 |
| E     |         5 |         2 |
| F     |         6 |         6 |
+-------+-----------+-----------+

Hier is een vollediger voorbeeld, met wat PHP om naar HTML uit te voeren... misschien kan iemand anders het mooi maken...

<?php
//simple_sorter.php
//Preamble

/*
A simple row repositioning script.
This is using a simple $_GET to determine which row is repositioned.
So you need to supply a source and a target in the url, e.g.:

https://path/to/simple_sorter.php?old_position=5&new_position=2

There is no error checking, so it can quite easily fall apart, and because   
the SELECT comes befpre the UPDATE, you won't see any changes until the 
next time you load the page.
*/

//Data Creation Statements

/*
DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(image CHAR(1) NOT NULL PRIMARY KEY
,position INT NOT NULL
);

INSERT INTO my_table VALUES
('A',1),
('B',2),
('C',3),
('D',4),
('E',5),
('F',6);
*/

require('path/to/pdo/connection/stateme.nts');

//My understanding is that the following is needed 
  in order to replace (every instance within the 
  query of) :old_position and :new_position with 
  their corresponding values

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);

//and now to the code...

$query = "
SELECT *
  FROM my_table
 ORDER
    BY position
";
$stmt  = $pdo->prepare($query);
$stmt->execute();
$data  = $stmt->fetchAll();
print_r($data);

$query = "
UPDATE my_table x
  JOIN
     ( SELECT image
            , position old_order
            , ROUND(CASE WHEN position NOT BETWEEN LEAST(:old_position,:new_position) AND GREATEST(:old_position,:new_position)
                         THEN position
                         WHEN position = :old_position THEN :new_position
                         ELSE position+(((:old_position>:new_position)-.5)*2)
                         END
                   ,0) new_order
         FROM my_table
     ) y
    ON y.image = x.image
   SET position = new_order
";

$old_position  = $_GET['old_position'];
$new_position  = $_GET['new_position'];

$stmt  = $pdo->prepare($query);
$stmt->execute(array('old_position' => $old_position,'new_position' => $new_position));

?>

Uitgangen (bijvoorbeeld, en afhankelijk van welke waarden werden gebruikt, en hoe vaak)...

Array
(
    [0] => Array
        (
            [image] => A
            [position] => 1
        )

    [1] => Array
        (
            [image] => D
            [position] => 2
        )

    [2] => Array
        (
            [image] => E
            [position] => 3
        )

    [3] => Array
        (
            [image] => B
            [position] => 4
        )

    [4] => Array
        (
            [image] => C
            [position] => 5
        )

    [5] => Array
        (
            [image] => F
            [position] => 6
        )

)



  1. Waar moet ik een externe sleutel bewaren?

  2. Mysql-opdracht niet gevonden in OS X 10.7

  3. Hoe selecteer je een rij met maximale waarde voor een kolom in MySQL?

  4. Het aantal kolommen van mysql.proc is onjuist. Verwacht 20, gevonden 16. De tabel is waarschijnlijk beschadigd