SQL ORDER BY (Starting with)


SQL ORDER BY (Starting with)

我有一个数据库,其中包含以下表:

CATEGORY
id
name

数据库中的另一个实体可以通过该实体上的外键分配这些类别中的任何一个。在我的PHP应用程序中,我想要一个下拉选项选择框来默认显示当前类别,但也允许选择任何其他类别,以便更改实体所属的类别。

在尝试制定一个SQL查询填充下拉选择选项,显示所有类别从当前选择的一个开始,我尝试了不同的东西,并提出了这个:

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

这似乎工作正常给定我的小样本数据集,但看到我只是猜测,我不是100%相信这是正确的查询,并将继续使用完整的数据集。我希望有人能确认这个SQL是合适的,或者建议是否有更好的方法来实现这一点。

此外,表单操作链接到包含UPDATE查询的页面,目前我通过首先运行类别名称的SELECT查询来获得类别ID,但是是否有一种方法我可以将每个类别的类别ID分配给它各自的选择选项?

谢谢!

还可以。
但你可以很容易地使用它,不排序(或其他顺序,如按名称),并将selected="selected"添加到id=[ID]

我不确定你最好的选择是重新排序选择,而不是简单地使特定的选项被选中(示例如下)。

您的查询应该一致地工作,因为id=[id]是一个布尔值,然后将根据它是真还是假转换为0或1。在这种情况下,我确实想知道索引——MySQL不太可能对此进行补偿。您可能希望将其与UNION DISTINCT交换,但您必须对自己进行基准测试:

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

对于直接从<select>获取ID,您始终可以使用选项的value属性:

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

在上面,如果选择绿色,PHP将接收$_REQUEST['mySelecte'] == '1'

最终PHP示例

$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>';

您建议的查询:

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

如果你想按id排序,那也是允许的:

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

要回答第二个问题,您填充select语句的方式是

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=属性的内容以表单中选择的值返回。