我有一个动态生成的网站,
页面(如Home,Contact ...)有文章
我将所有内容存储在SQL中
问题是:
我应该如何使用管理页面对文章进行排序?
例如:
主页:
它有3篇文章:新闻,Zzz,测试
在SQL中,文章有“contentOrder”,新闻 - > 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是主键时,我可以做到这一点的唯一方法,因为我应该将整行移动到somthng,如果它不是主键,只有contentOrder会被更改。
我不知道该怎么做。(我应该为ContentOrder创建另一个表吗?)
我的英语不好。 :/
答案 0 :(得分:1)
如果您尝试将第8篇文章作为第一篇文章,请考虑会发生什么。目前首先应该成为第二个,第二个成为第三个,依此类推等等。因此,您实际上需要更新其余的匹配项,而不是切换两个contentOrder值。
考虑到这一点,我的解决方案是查询所有文章,对它们进行排序,然后使用新订单更新数据库中的所有行。如果您可以在存储过程中执行此操作,或者在PHP中不进行所有这些查询,则可能更可取。
希望我能用这个更好地解释一下:
您有起始内容顺序(格式为[文章ID,内容顺序]):
[1, 1], [2, 2], [3, 3], [4, 4]
您现在想要将文章ID 4作为第一篇文章,因此您的列表将成为
[1, 2], [2, 3], [3, 4], [4, 1]
答案 1 :(得分:0)
我不确定我是否理解你的问题,但是: 如果使用contentOrder列定义数据的顺序(您更新,以反映这一点),您可以使用“Order by”子句简单地选择它们。您不需要将contentOrder列作为主键(但您可以将其包含在索引中,因此数据已经正确排序 - 这取决于您的使用/数据)。
要更改排序,您可以生成“批量”更新, 例如 如果你想将一个项目从contentOrder 3移动到第一个:
update pagescontent set contentOrder = contentOrder - 1 where contentOrder > 3 and contentOrder <= $newPosition
///其中3是你要移动的项目的contentOrder,$ newPosition是新的contentOrder 然后更新你jsut移动的existingRow,:
update pagescontent set contentOrder = $newPosition where id = $idOfRecordToMoveUp
与此类似,您可以执行其他排序操作的操作。
您可以选择Top'x'文章并通过contentOrder列进行排序(根据您的数据库系统,您可以使用TOP / Limit子句执行此操作)。 例如:
SELECT * FROM pagescontent ORDER BY contentOrder
您还可以通过向ORDER BY子句添加ASC或DESC来对数据进行升序/降序排序(不确定这是否适用于您的数据库系统)。 我还建议为查询使用参数,以避免SQL注入和其他可能的问题。