我有一个包含下表的数据库:
CATEGORY
id
name
可以通过该实体上的外键为数据库中的另一个实体分配任何这些类别。在我的PHP应用程序中,我想要一个下拉选项选择框以默认显示当前类别,但也允许选择任何其他类别以更改实体所属的类别。
在尝试制定一个SQL查询以填充显示所有以当前所选类别开头的类别的下拉选项时,我尝试了不同的事情并提出了这个:
SELECT name FROM category ORDER BY id=[ID] DESC
考虑到我的一小部分样本数据,这似乎工作正常,但看到我只是猜测,我不是100%确信这是正确的查询,并将继续使用完整的数据集。我希望有人可以确认这个SQL是合适的,或者建议是否有更好的方法来实现这一点。
此外,表单操作链接到包含UPDATE查询的页面,目前我通过首先运行类别名称的SELECT查询来获取类别ID,但有一种方法我可以只分配类别ID对于每个类别的相应选择选项?
谢谢!
答案 0 :(得分:3)
没关系。
但您可以轻松使用它而不进行排序(或使用其他顺序,即名称),并将selected="selected"
添加到id=[ID]
答案 1 :(得分:1)
您建议查询:
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
要回答第二个问题,填充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=
属性的内容将返回表单中选择的值。
答案 2 :(得分:1)
我不确定您的最佳选择是重新订购选择而不是简单地选择特定选项(例如下面的例子)。
您的查询应该一致地工作,因为id = [id]是一个布尔值,然后根据它是true还是false将其转换为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'
。
$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>';