SQL ORDER BY (Начиная с) - PullRequest
       2

SQL ORDER BY (Начиная с)

1 голос
/ 03 августа 2011

У меня есть база данных со следующей таблицей:

CATEGORY
id
name

Другой объект в базе данных может быть назначен любой из этих категорий через внешний ключ для этого объекта.В моем PHP-приложении я хочу, чтобы в раскрывающемся списке опций по умолчанию отображалась текущая категория, но также можно было выбрать любую другую, чтобы изменить категорию, к которой принадлежит объект.

При попыткечтобы сформулировать SQL-запрос для заполнения выпадающего списка опций выбора, который отображает все категории, начиная с текущей выбранной, я пробовал разные вещи и придумал следующее:

SELECT name FROM category ORDER BY id=[ID] DESC

Что, кажется, работает правильно, учитывая мойНебольшой набор выборочных данных, но, поскольку я только догадывался, я не уверен на 100%, что это правильный запрос и продолжит работу с полным набором данных.Я надеюсь, что кто-то может подтвердить, что этот SQL подходит, или предложить, если есть лучший способ сделать это.

Кроме того, действие формы ссылается на страницу, содержащую запрос UPDATE, и в настоящее время я возвращаю идентификатор категории, сначала выполнив запрос SELECT для имени категории, но есть ли способ, который я могу просто назначитьидентификатор категории для каждой категории для соответствующей опции выбора?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 03 августа 2011

все в порядке.
Но вы можете легко использовать его без сортировки (или с другим порядком, например, по имени) и добавить selected="selected" к одному с id=[ID]

1 голос
/ 03 августа 2011

Я не уверен, что ваш лучший вариант - это изменить порядок выбора вместо простого выбора конкретной опции (пример ниже).

Ваш запрос должен работать последовательно, потому что id = [id] является логическим значениемкоторый затем будет преобразован в 0 или 1 в зависимости от того, является ли оно истинным или ложным.Я действительно задаюсь вопросом об индексе в таких случаях - MySQL вряд ли компенсирует это.Возможно, вы захотите поменять это на UNION DISTINCT, но вам придется самим сравнивать:

-- possible UNION DISTINCT
SELECT * FROM CATEGORY WHERE ID = [id]
UNION DISTINCT
SELECT * FROM CATEGORY;

Что касается непосредственного получения идентификатора из <select>, вы всегда можете использовать свойство valueпараметры:

<select name="mySelect">
    <option value="1">Green</option>
    <option value="2">Blue</option>
</select>

В приведенном выше примере, если выбран зеленый, PHP получит $_REQUEST['mySelecte'] == '1'.

FINAL PHP EXAMPLE

$selectedID = $_REQUEST['mySelect'];
// if you absolutely *have* to make the selected item first, replace the 
// following with one of the two queries above
$q = mysql_query( 'SELECT id, name FROM CATEGORIES' ) or die( mysql_error() );
echo '<select name="mySelect">';
while( $option = mysql_fetch_assoc( $q ) )
{
    echo '<option value="' . $selectedID . '"';
    if( $option[ 'id' ] == $selectedID ) echo ' selected="selected"';
    echo '>' . $option['name'] . '</option>' . PHP_EOL;
}
echo '</select>';
1 голос
/ 03 августа 2011

Вы предложили запрос:

SELECT name FROM category ORDER BY id=[ID] DESC

Этот запрос будет работать, так как id=[ID] даст логический результат (1 или 0), и вы используете DESC для установки1 первый.Тем не менее, другие категории не гарантированно отображаются в любом конкретном порядке.Однако, если у вас есть поле, которое вы хотите отсортировать по мере того, как вы позаботились о размещении категории первым, вы можете добавить это поле в качестве другого поля в предложении ORDER BY.

SELECT name FROM category ORDER BY id=[ID] DESC, name ASC

Есливы хотите отсортировать остальных по их идентификатору, это тоже разрешено:

SELECT name FROM category ORDER BY id=[ID] DESC, id ASC

Чтобы ответить на ваш второй вопрос, вы должны заполнить оператор выбора следующим образом:

puts "<select>"
databasehandle.select_all "select name, id from category ORDER BY..." do |name,id|
   printf '<option value="%d">%s</option>', id, name
end
puts "</select>"

(проститея использую Ruby вместо PHP - я полагаю, вы можете перевести.)

Содержимое атрибута value= отправляет обратно значение, выбранное в форме.

...