我有一个动态生成的网站,
这些页面(比如主页、联系人……)都有文章。
我将所有内容存储在SQL中。
问题是:
我应该如何对有管理页面的文章进行排序?
例子:
主页:
它有3篇文章:新闻,Zzz,测试
在SQL中,文章有"contentOrder",News -> 1, Zzz ->2, Test->3,
如果在管理页面中,用户希望Zzz的文章是第一篇,我会这样做:
mysql_query('UPDATE pagescontent SET contentOrder=0 WHERE contentOrder='.$aktOrder);
mysql_query("UPDATE pagescontent SET contentOrder=$aktOrder WHERE contentOrder=$aktOrderUp");
mysql_query("UPDATE pagescontent SET contentOrder=$aktOrderUp WHERE contentOrder=0");
我只是交换了两篇文章"contentOrder"。但问题是,当contentOrder是主键时,我唯一能做到的是,因为我应该移动整行来做点什么,如果它不是主键,只有contentOrder会被改变。
我真的不知道我该怎么做。(我应该为ContentOrder创建另一个表吗?)
对不起,我的英语不好。:/考虑如果您尝试将第八篇文章作为第一篇文章会发生什么。目前排名第一的文章应该成为第二,第二的文章应该成为第三,以此类推。所以比起切换两个contentOrder值,你实际上需要更新其余的值来匹配。
考虑到这一点,我的解决方案是查询所有文章,对它们进行排序,然后用新的顺序更新数据库中的所有行。如果您可以在存储过程中做到这一点,或者不需要在PHP中进行所有这些查询,那么这可能是更可取的。
希望我能更好地解释这一点:
你有你的起始内容顺序(格式为[文章ID,内容顺序]):
[1, 1], [2, 2], [3, 3], [4, 4]
你现在想让你的文章ID为4的第一篇文章,所以你的列表将成为
[1, 2], [2, 3], [3, 4], [4, 1]
我不确定我是否正确理解你的问题,但是:如果您使用contentOrder列定义数据的顺序(您需要更新该列以反映这一点),则可以使用"order by"子句简单地选择它们。您不需要将contentOrder列作为主键(但您可以将其包含在索引中,因此数据已经正确排序-这取决于您的用法/data)。
要更改排序,你可以生成"批量"更新,如。如果你想把一个条目从contentOrder 3移到第一个:
update pagescontent set contentOrder = contentOrder - 1 where contentOrder > 3 and contentOrder <= $newPosition
///其中3是你想要上移的项的contentOrder, $newPosition是新的contentOrder然后更新您刚刚移动的现有行:
update pagescontent set contentOrder = $newPosition where id = $idOfRecordToMoveUp
与此类似,您可以执行其他排序操作的操作。
你可以选择Top 'x'文章并按contentOrder列排序(取决于你的数据库系统,你可以用Top/Limit子句这样做)。例如:
SELECT * FROM pagescontent ORDER BY contentOrder
您还可以对数据进行升序/降序排序,通常通过在order by子句中添加ASC或DESC(不确定这是否适用于您的数据库系统)。我还建议在查询中使用参数,以避免SQL注入和其他可能的问题。